Group by函数在Oracle存储过程中不起作用[重复]

mwecs4sa  于 9个月前  发布在  Oracle
关注(0)|答案(1)|浏览(98)

此问题已在此处有答案

Group by alias (Oracle)(6个回答)
上个月关门了。
我已经创建了一个stored-procedure,我想根据一些状态和日期执行和显示数据。在这个查询中,我使用了GROUP BY函数。但它给了我错误,
ORA-00904:“TFC”.“OFFFERED_DATE”:无效标识符
查询

SELECT DISTINCT TO_CHAR(TFC.SPANID) , TO_CHAR(TFC.MZ_CODE) AS  MAINT_ZONE_CODE,  TO_CHAR(TFC.MZ_NAME) AS  MAINT_ZONE_NAME,
                SUM(TFC.MHO_HANDOVER_CERT) AS NE_LENGTH,
                TFC.CREATED_DATE AS OFFERED_DATE
                FROM APP_LCO.tbl_fip_checklist TFC
   WHERE LENGTH(trim(TFC.SPANID)) > 8
                AND LENGTH(trim(TFC.SPANID)) < 21
  AND tfc.status = 'APPROVED'
                MINUS
          SELECT TO_CHAR(BB.LINK_ID) AS SPAN_ID,
                TO_CHAR(BB.MAINTENANCEZONECODE) AS  MAINT_ZONE_CODE,
                TO_CHAR(BB.MAINTENANCEZONENAME) AS  MAINT_ZONE_NAME,
                MAINT_ZONE_NE_SPAN_LENGTH AS  NE_LENGTH,
                BB.CREATED_DATE
                  FROM TBL_FIBER_INV_JOBS BB
                  WHERE SPAN_TYPE = 'INTRACITY'
   group by TFC.SPANID,TFC.MZ_CODE, TFC.MZ_NAME, TFC.MHO_HANDOVER_CERT, TFC.OFFERED_DATE;
gdrx4gfi

gdrx4gfi1#

这是因为你不能按别名分组-你必须使用列名,那就是tfc.created_date
你放错了GROUP BY条款;它不能在第二个查询的末尾(因为你使用了两个SELECTMINUS集合运算符),而是包含聚合的那个-这是第一个查询:
除此之外,distinct在包含group by子句的查询中没有用处。
所以:

SELECT TO_CHAR (tfc.spanid),                 --> remove DISTINCT
         TO_CHAR (tfc.mz_code) AS maint_zone_code,
         TO_CHAR (tfc.mz_name) AS maint_zone_name,
         SUM (tfc.mho_handover_cert) AS ne_length,
         tfc.created_date AS offered_date      --> column name is CREATED_DATE
    FROM app_lco.tbl_fip_checklist tfc
   WHERE     LENGTH (TRIM (tfc.spanid)) > 8
         AND LENGTH (TRIM (tfc.spanid)) < 21
         AND tfc.status = 'APPROVED'
GROUP BY TO_CHAR (tfc.spanid),                 --> move GROUP BY here
         TO_CHAR (tfc.mz_code),
         TO_CHAR (tfc.mz_name),
         tfc.created_date                      --> use column name (not its alias) here
MINUS
  SELECT TO_CHAR (bb.link_id) AS span_id,
         TO_CHAR (bb.maintenancezonecode) AS maint_zone_code,
         TO_CHAR (bb.maintenancezonename) AS maint_zone_name,
         maint_zone_ne_span_length AS ne_length,
         bb.created_date
    FROM tbl_fiber_inv_jobs bb
   WHERE span_type = 'INTRACITY'

**[编辑]**如何使用该查询作为另一个SELECT语句的源(CTE):

WITH
   temp
   AS
-- your current query begins here ...
      (  SELECT TO_CHAR (tfc.spanid) spanid,              
                TO_CHAR (tfc.mz_code) AS maint_zone_code,
                TO_CHAR (tfc.mz_name) AS maint_zone_name,
                SUM (tfc.mho_handover_cert) AS ne_length,
                tfc.created_date AS offered_date          
           FROM app_lco.tbl_fip_checklist tfc
          WHERE     LENGTH (TRIM (tfc.spanid)) > 8
                AND LENGTH (TRIM (tfc.spanid)) < 21
                AND tfc.status = 'APPROVED'
       GROUP BY TO_CHAR (tfc.spanid),                     
                TO_CHAR (tfc.mz_code),
                TO_CHAR (tfc.mz_name),
                tfc.created_date              
       MINUS
       SELECT TO_CHAR (bb.link_id) AS span_id,
              TO_CHAR (bb.maintenancezonecode) AS maint_zone_code,
              TO_CHAR (bb.maintenancezonename) AS maint_zone_name,
              maint_zone_ne_span_length AS ne_length,
              bb.created_date
         FROM tbl_fiber_inv_jobs bb
        WHERE span_type = 'INTRACITY')
-- ... and ends here
  SELECT spanid,
         maint_zone_code,
         maint_zone_name,
         SUM (ne_length),
         offered_date
    FROM temp
GROUP BY spanid,
         maint_zone_code,
         maint_zone_name,
         offered_date;

**[编辑#2]**您评论说您仍然会得到重复的行;你不该这么做这里有一个简单的例子,它表明没有重复:

SQL> WITH
  2     temp (spanid,
  3           maint_zone_code,
  4           maint_zone_name,
  5           ne_length,
  6           offered_date)
  7     AS
  8        (SELECT 'MUMB_1208', 'MB01', 'Navi Mumbai', 23, DATE '2023-07-31' FROM DUAL
  9         UNION ALL
 10         SELECT 'VDDR_0001', 'DR01', 'Vadodara-1', 3, DATE '2023-06-08' FROM DUAL
 11         UNION ALL
 12         SELECT 'VDDR_0001', 'DR01', 'Vadodara-1', 4, DATE '2023-06-08' FROM DUAL
 13         UNION ALL
 14         SELECT 'VDDR_0001', 'DR01', 'Vadodara-1', 5, DATE '2023-06-08' FROM DUAL)
 15    SELECT spanid,
 16           maint_zone_code,
 17           maint_zone_name,
 18           SUM (ne_length),
 19           offered_date
 20      FROM temp
 21  GROUP BY spanid,
 22           maint_zone_code,
 23           maint_zone_name,
 24           offered_date;

SPANID    MAIN MAINT_ZONE_ SUM(NE_LENGTH) OFFERED_
--------- ---- ----------- -------------- --------
MUMB_1208 MB01 Navi Mumbai             23 31.07.23
VDDR_0001 DR01 Vadodara-1              12 08.06.23

SQL>

相关问题