【问题标题】:oracle sql not a group by expression while counting [duplicate]oracle sql在计数时不是按表达式分组[重复]
【发布时间】:2013-10-13 13:44:12
【问题描述】:

我正在尝试运行以下查询,计算过去 6 个月内有患者转诊的医生数量:

SELECT 
    count(local_doc.providerno) NumberofReferals, 
    LOCAL_DOC.FULLNAME FULLNAME, 
    LOCAL_DOC.TELNUMBER TELNUMBER, 
    LOCAL_DOC.STREET STREET, 
    LOCAL_DOC.SUBURB SUBURB, 
    LOCAL_DOC.STATE STATE, 
    LOCAL_DOC.POSTCODE POSTCODE,
    LOCAL_DOC.PROVIDERNO
FROM 
    LOCAL_DOC, 
    PATIENT 
WHERE 
    PATIENT.PROVIDERNO = LOCAL_DOC.PROVIDERNO AND PATIENT.REFERALDATE <= sysdate AND PATIENT.REFERALDATE >= ADD_MONTHS(sysdate, -6)
    group by local_doc.providerno;

我一直在努力

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Error at Line: 3 Column: 5

并且不知道如何解决这个问题。我怎么能这样做?

【问题讨论】:

    标签: sql oracle ora-00979


    【解决方案1】:

    亲爱的,group By Clause 要求用户指定所有 Select Columns Group By Clause 除了选择具有聚合的列 功能。

    查看我的 Group by Clause 我已经在 Select 中指定了所有列,除了 local_doc.providerno 因为它使用的是聚合函数 COUNT

    为了更好的理解,请参考这个link

     SELECT 
        count(local_doc.providerno) NumberofReferals, 
        LOCAL_DOC.FULLNAME FULLNAME, 
        LOCAL_DOC.TELNUMBER TELNUMBER, 
        LOCAL_DOC.STREET STREET, 
        LOCAL_DOC.SUBURB SUBURB, 
        LOCAL_DOC.STATE STATE, 
        LOCAL_DOC.POSTCODE POSTCODE,
        LOCAL_DOC.PROVIDERNO
    FROM 
        LOCAL_DOC, 
        PATIENT 
    WHERE 
        PATIENT.PROVIDERNO = LOCAL_DOC.PROVIDERNO AND PATIENT.REFERALDATE <= sysdate AND PATIENT.REFERALDATE >= ADD_MONTHS(sysdate, -6)
    GROUP BY
        LOCAL_DOC.FULLNAME , 
        LOCAL_DOC.TELNUMBER , 
        LOCAL_DOC.STREET , 
        LOCAL_DOC.SUBURB , 
        LOCAL_DOC.STATE , 
        LOCAL_DOC.POSTCODE ,
        LOCAL_DOC.PROVIDERNO
    

    【讨论】:

    • 我试过这样做,oracle给出了以下错误:ORA-00933: SQL command not properly ended 00933. 00000 - "SQL command not properly ended" *Cause: *Action: Error at Line: 15 Column: 33
    • @Pindo 对不起,别名已从 group by 子句中删除,请立即查看,谢谢
    【解决方案2】:

    添加

    GROUP BY 
        LOCAL_DOC.FULLNAME , 
        LOCAL_DOC.TELNUMBER , 
        LOCAL_DOC.STREET , 
        LOCAL_DOC.SUBURB , 
        LOCAL_DOC.STATE , 
        LOCAL_DOC.POSTCODE ,
        LOCAL_DOC.PROVIDERNO
    

    除 MYSql 之外的大多数 DBS​​ 都要求您对剩余的选定列进行分组

    【讨论】:

      【解决方案3】:

      在分组中,您必须知道哪些列可以在其中的行中获得重复值,然后将其添加到您的 group by 查询是:

      SELECT 
      count(local_doc.providerno) NumberofReferals, 
      LOCAL_DOC.FULLNAME FULLNAME, 
      LOCAL_DOC.TELNUMBER TELNUMBER, 
      LOCAL_DOC.STREET STREET, 
      LOCAL_DOC.SUBURB SUBURB, 
      LOCAL_DOC.STATE STATE, 
      LOCAL_DOC.POSTCODE POSTCODE,
      LOCAL_DOC.PROVIDERNO
      FROM 
      LOCAL_DOC, 
      PATIENT 
      WHERE 
      PATIENT.PROVIDERNO = LOCAL_DOC.PROVIDERNO AND PATIENT.REFERALDATE <= sysdate AND PATIENT.REFERALDATE >= ADD_MONTHS(sysdate, -6)
      group by 
      LOCAL_DOC.FULLNAME, 
      LOCAL_DOC.TELNUMBER, 
      LOCAL_DOC.STREET, 
      LOCAL_DOC.SUBURB, 
      LOCAL_DOC.STATE, 
      LOCAL_DOC.POSTCODE,
      LOCAL_DOC.PROVIDERNO;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 2013-04-11
        • 1970-01-01
        • 2011-05-25
        • 2010-12-03
        相关资源
        最近更新 更多