【问题标题】:ORA-00937: not a single-group group function PROBLEMORA-00937: 不是单组组函数问题
【发布时间】:2022-01-19 08:38:18
【问题描述】:

我正在尝试查找每个 BRACKTS 的每个 trans 类型的每个值弯曲分析的交易数量:1-100、101-200

SELECT TO_CHAR(TRANSDATE,'MM-YY') MONTH 
, AGENT_NUMBER 
, COUNT(DISTINCT RECEIVER) NUM_OF_CUST 
, COMMAND_ID 
, BRACKETS 
FROM (
    SELECT TRANSDATE 
    , AGENT_NUMBER 
    , RECEIVER 
    , COMMAND_ID 
    , CASE 
      WHEN COUNT(DISTINCT RECEVIVER) BETWEEN 1 AND 100 THEN '1-100' , 
      WHEN COUNT(DISTINCT RECEIVER) BETWEEN 101 AND 200 THEN '101-200' 
      ELSE '0' END BRACKETS 
    FROM TRANSACTION@ABSDB 
    WHERE RESULT_CODE = 'DONE' 
    AND TO_CHAR (TRANSDATE,''MM-YY) = '06-21')
GROUP BY  TO_CHAR(TRANSDATE,'MM-YY') 
        , AGENT_NUMBER  , COMMAND_ID , BRACKETS 

【问题讨论】:

  • 我看不出这个查询是如何产生你的错误的。
  • 派生表包含集合函数,但没有GROUP BY。

标签: sql oracle


【解决方案1】:

您需要在COUNT(DISTINCT ...) 的内部子查询中使用GROUP BY(并且至少有一个错字,可能有两个,请参阅内联 cmets):

SELECT MONTH 
,      AGENT_NUMBER 
,      COUNT(DISTINCT RECEIVER) NUM_OF_CUST 
,      COMMAND_ID 
,      BRACKETS 
FROM   (
  SELECT TO_CHAR(TRANSDATE, 'MM-YY') AS month
  ,      AGENT_NUMBER 
  ,      RECEIVER 
  ,      COMMAND_ID 
  ,      CASE 
         WHEN COUNT(DISTINCT RECEVIVER) BETWEEN 1 AND 100 THEN '1-100' ,
         --                      ^ Is this spelt correctly?
         WHEN COUNT(DISTINCT RECEIVER) BETWEEN 101 AND 200 THEN '101-200' 
         ELSE '0' END BRACKETS 
  FROM   TRANSACTION@ABSDB 
  WHERE  RESULT_CODE = 'DONE' 
  AND    TO_CHAR(TRANSDATE, 'MM-YY') = '06-21'  -- Also the quotes were wrong here
  GROUP BY TO_CHAR(TRANSDATE, 'MM-YY'),
         , AGENT_NUMBER 
         , RECEIVER 
         , COMMAND_ID 
)
GROUP BY  MONTH
        , AGENT_NUMBER
        , COMMAND_ID
        , BRACKETS;

【讨论】:

  • 尊敬的 MT0,非常感谢您的回答.. 帮助很大
  • 如果答案解决了您的问题,请接受它。这有助于未来的提问者有相同或相似的问题,并从未回答的队列中删除问题。请不要将已成功回答的问题留在未回答队列中。
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2020-05-10
相关资源
最近更新 更多