组由+选择案例

发布于 2025-02-07 20:47:11 字数 1282 浏览 1 评论 0原文

我尝试查询此代码,但我得到了错误按摩。 “ ORA-00979:不是按表达来的组” 我们可以按函数使用案例总和和最大。

  SELECT PLAN.MFGNO                     "MFGNO",
         PROCESSMASTER.PART_NO          "PART_NO",
         PROCESS.MED_PROC_CD            "M_PROCESS",
         MAX(PLAN.PLAN_START)           "PLAN_START_DATE",
         MAX(PLAN.PLAN_END)             "PLAN_END_DATE",
         MAX(PLAN.ACT_START)            "ACT_START_DATE",
         MAX(PLAN.ACT_END)              "ACT_END_DATE",
         (CASE WHEN PROCESSMASTER.COMP_FLG =1 AND PROCESS.MED_PROC_CD='OUT-P' THEN SUM(SUB_PRO.HACYUKIN) 
         ELSE MAX(SUB_PRO.HACYUKIN)
         END) "SUB_TOTAL_PRICE",
         --SUM(SUB_PRO.HACYUKIN)          "SUB_TOTAL_PRICE",
         MAX(SUB_PRO.SICD)              "SUB_CODE",
         MAX(PROCESSMASTER.PROC_REM) "DE_PROCESS"
  FROM   T_PLANDATA PLAN
         INNER JOIN T_PROCESSNO PROCESSMASTER
                 ON PLAN.BARCODE = PROCESSMASTER.BARCODE
         INNER JOIN T_PLANNED_PROCESS PROCESS
                 ON PROCESSMASTER.PROCESS_CD = PROCESS.PLAN_PROC_CD
         INNER JOIN KEIKAKUMST SUB_PRO
                 ON PROCESSMASTER.BARCODE = SUB_PRO.KMSEQNO
  WHERE PLAN.MFGNO ='T21-F2D1-10034'
  GROUP  BY PLAN.MFGNO,
            PROCESSMASTER.PART_NO,
            PROCESS.MED_PROC_CD;

I try to query this code but i got the error massage.
"ORA-00979: not a GROUP BY expression"
Can we use case SUM and Max in group by function.

  SELECT PLAN.MFGNO                     "MFGNO",
         PROCESSMASTER.PART_NO          "PART_NO",
         PROCESS.MED_PROC_CD            "M_PROCESS",
         MAX(PLAN.PLAN_START)           "PLAN_START_DATE",
         MAX(PLAN.PLAN_END)             "PLAN_END_DATE",
         MAX(PLAN.ACT_START)            "ACT_START_DATE",
         MAX(PLAN.ACT_END)              "ACT_END_DATE",
         (CASE WHEN PROCESSMASTER.COMP_FLG =1 AND PROCESS.MED_PROC_CD='OUT-P' THEN SUM(SUB_PRO.HACYUKIN) 
         ELSE MAX(SUB_PRO.HACYUKIN)
         END) "SUB_TOTAL_PRICE",
         --SUM(SUB_PRO.HACYUKIN)          "SUB_TOTAL_PRICE",
         MAX(SUB_PRO.SICD)              "SUB_CODE",
         MAX(PROCESSMASTER.PROC_REM) "DE_PROCESS"
  FROM   T_PLANDATA PLAN
         INNER JOIN T_PROCESSNO PROCESSMASTER
                 ON PLAN.BARCODE = PROCESSMASTER.BARCODE
         INNER JOIN T_PLANNED_PROCESS PROCESS
                 ON PROCESSMASTER.PROCESS_CD = PROCESS.PLAN_PROC_CD
         INNER JOIN KEIKAKUMST SUB_PRO
                 ON PROCESSMASTER.BARCODE = SUB_PRO.KMSEQNO
  WHERE PLAN.MFGNO ='T21-F2D1-10034'
  GROUP  BY PLAN.MFGNO,
            PROCESSMASTER.PART_NO,
            PROCESS.MED_PROC_CD;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱格式化 2025-02-14 20:47:11

我们可以按函数使用案例和最大。

是的

,但是您的问题是您使用processMaster.comp_flg = 1和process.med_proc_cd ='out-p'case> case case expression and no processmaster.comp_flg nor process.med_proc_cd在子句中或聚合函数内部的组中。

您要么想要:

SELECT PLAN.MFGNO                     "MFGNO",
       PROCESSMASTER.PART_NO          "PART_NO",
       PROCESS.MED_PROC_CD            "M_PROCESS",
       MAX(PLAN.PLAN_START)           "PLAN_START_DATE",
       MAX(PLAN.PLAN_END)             "PLAN_END_DATE",
       MAX(PLAN.ACT_START)            "ACT_START_DATE",
       MAX(PLAN.ACT_END)              "ACT_END_DATE",
       (CASE WHEN PROCESSMASTER.COMP_FLG =1 AND PROCESS.MED_PROC_CD='OUT-P' THEN SUM(SUB_PRO.HACYUKIN) 
       ELSE MAX(SUB_PRO.HACYUKIN)
       END) "SUB_TOTAL_PRICE",
       --SUM(SUB_PRO.HACYUKIN)          "SUB_TOTAL_PRICE",
       MAX(SUB_PRO.SICD)              "SUB_CODE",
       MAX(PROCESSMASTER.PROC_REM) "DE_PROCESS"
FROM   T_PLANDATA PLAN
       INNER JOIN T_PROCESSNO PROCESSMASTER
               ON PLAN.BARCODE = PROCESSMASTER.BARCODE
       INNER JOIN T_PLANNED_PROCESS PROCESS
               ON PROCESSMASTER.PROCESS_CD = PROCESS.PLAN_PROC_CD
       INNER JOIN KEIKAKUMST SUB_PRO
               ON PROCESSMASTER.BARCODE = SUB_PRO.KMSEQNO
WHERE PLAN.MFGNO ='T21-F2D1-10034'
GROUP  BY PLAN.MFGNO,
          PROCESSMASTER.PART_NO,
          PROCESS.MED_PROC_CD,
          PROCESSMASTER.COMP_FLG,     -- Add to the group by clause
          PROCESS.MED_PROC_CD         -- Add to the group by clause
;

或类似:

SELECT PLAN.MFGNO                     "MFGNO",
       PROCESSMASTER.PART_NO          "PART_NO",
       PROCESS.MED_PROC_CD            "M_PROCESS",
       MAX(PLAN.PLAN_START)           "PLAN_START_DATE",
       MAX(PLAN.PLAN_END)             "PLAN_END_DATE",
       MAX(PLAN.ACT_START)            "ACT_START_DATE",
       MAX(PLAN.ACT_END)              "ACT_END_DATE",
       CASE
       WHEN MAX(PROCESSMASTER.COMP_FLG) = 1
       AND  COUNT(CASE WHEN PROCESS.MED_PROC_CD = 'OUT-P' THEN 1 END) > 0
       THEN SUM(SUB_PRO.HACYUKIN) 
       ELSE MAX(SUB_PRO.HACYUKIN)
       END "SUB_TOTAL_PRICE",
       --SUM(SUB_PRO.HACYUKIN)          "SUB_TOTAL_PRICE",
       MAX(SUB_PRO.SICD)              "SUB_CODE",
       MAX(PROCESSMASTER.PROC_REM) "DE_PROCESS"
FROM   T_PLANDATA PLAN
       INNER JOIN T_PROCESSNO PROCESSMASTER
               ON PLAN.BARCODE = PROCESSMASTER.BARCODE
       INNER JOIN T_PLANNED_PROCESS PROCESS
               ON PROCESSMASTER.PROCESS_CD = PROCESS.PLAN_PROC_CD
       INNER JOIN KEIKAKUMST SUB_PRO
               ON PROCESSMASTER.BARCODE = SUB_PRO.KMSEQNO
WHERE PLAN.MFGNO ='T21-F2D1-10034'
GROUP  BY PLAN.MFGNO,
          PROCESSMASTER.PART_NO,
          PROCESS.MED_PROC_CD;

注意:这是未经测试的,因为您没有提供表或数据的最小代表性示例。

Can we use case SUM and Max in group by function.

Yes

However, your problem is that you use PROCESSMASTER.COMP_FLG =1 AND PROCESS.MED_PROC_CD = 'OUT-P' inside the CASE expression and neither PROCESSMASTER.COMP_FLG nor PROCESS.MED_PROC_CD are in the GROUP BY clause or inside of an aggregation function.

You either want:

SELECT PLAN.MFGNO                     "MFGNO",
       PROCESSMASTER.PART_NO          "PART_NO",
       PROCESS.MED_PROC_CD            "M_PROCESS",
       MAX(PLAN.PLAN_START)           "PLAN_START_DATE",
       MAX(PLAN.PLAN_END)             "PLAN_END_DATE",
       MAX(PLAN.ACT_START)            "ACT_START_DATE",
       MAX(PLAN.ACT_END)              "ACT_END_DATE",
       (CASE WHEN PROCESSMASTER.COMP_FLG =1 AND PROCESS.MED_PROC_CD='OUT-P' THEN SUM(SUB_PRO.HACYUKIN) 
       ELSE MAX(SUB_PRO.HACYUKIN)
       END) "SUB_TOTAL_PRICE",
       --SUM(SUB_PRO.HACYUKIN)          "SUB_TOTAL_PRICE",
       MAX(SUB_PRO.SICD)              "SUB_CODE",
       MAX(PROCESSMASTER.PROC_REM) "DE_PROCESS"
FROM   T_PLANDATA PLAN
       INNER JOIN T_PROCESSNO PROCESSMASTER
               ON PLAN.BARCODE = PROCESSMASTER.BARCODE
       INNER JOIN T_PLANNED_PROCESS PROCESS
               ON PROCESSMASTER.PROCESS_CD = PROCESS.PLAN_PROC_CD
       INNER JOIN KEIKAKUMST SUB_PRO
               ON PROCESSMASTER.BARCODE = SUB_PRO.KMSEQNO
WHERE PLAN.MFGNO ='T21-F2D1-10034'
GROUP  BY PLAN.MFGNO,
          PROCESSMASTER.PART_NO,
          PROCESS.MED_PROC_CD,
          PROCESSMASTER.COMP_FLG,     -- Add to the group by clause
          PROCESS.MED_PROC_CD         -- Add to the group by clause
;

or something like:

SELECT PLAN.MFGNO                     "MFGNO",
       PROCESSMASTER.PART_NO          "PART_NO",
       PROCESS.MED_PROC_CD            "M_PROCESS",
       MAX(PLAN.PLAN_START)           "PLAN_START_DATE",
       MAX(PLAN.PLAN_END)             "PLAN_END_DATE",
       MAX(PLAN.ACT_START)            "ACT_START_DATE",
       MAX(PLAN.ACT_END)              "ACT_END_DATE",
       CASE
       WHEN MAX(PROCESSMASTER.COMP_FLG) = 1
       AND  COUNT(CASE WHEN PROCESS.MED_PROC_CD = 'OUT-P' THEN 1 END) > 0
       THEN SUM(SUB_PRO.HACYUKIN) 
       ELSE MAX(SUB_PRO.HACYUKIN)
       END "SUB_TOTAL_PRICE",
       --SUM(SUB_PRO.HACYUKIN)          "SUB_TOTAL_PRICE",
       MAX(SUB_PRO.SICD)              "SUB_CODE",
       MAX(PROCESSMASTER.PROC_REM) "DE_PROCESS"
FROM   T_PLANDATA PLAN
       INNER JOIN T_PROCESSNO PROCESSMASTER
               ON PLAN.BARCODE = PROCESSMASTER.BARCODE
       INNER JOIN T_PLANNED_PROCESS PROCESS
               ON PROCESSMASTER.PROCESS_CD = PROCESS.PLAN_PROC_CD
       INNER JOIN KEIKAKUMST SUB_PRO
               ON PROCESSMASTER.BARCODE = SUB_PRO.KMSEQNO
WHERE PLAN.MFGNO ='T21-F2D1-10034'
GROUP  BY PLAN.MFGNO,
          PROCESSMASTER.PART_NO,
          PROCESS.MED_PROC_CD;

Note: this is untested as you have not provided a minimal representative example of your tables or data to test against.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文