【问题标题】:Appropriate Aggregate function, or how to get around it适当的聚合函数,或如何绕过它
【发布时间】:2012-10-12 00:10:07
【问题描述】:

我正在尝试使用 "CASE" 操作执行选择语句,但它说我的条件 (abc.reason) 无效,因为它既不包含在聚合函数中,也不包含在聚合函数中或GROUP BY 子句。我尝试将它添加到 GROUP BY 子句,但在我的结果表中创建了一个不必要的行。有什么建议吗?

SELECT

DISTINCT ID 
,(CASE WHEN reason = 4 THEN null ELSE SUM(quantity*price) END) AS Value
,COUNT(*) AS CountAll

来自交易数据库

GROUP BY ID

ORDER BY ID DESC

如果我将 GROUP BY 子句更改为 GROUP BY ID, reason,那么我的结果是:

ID ---- VALUE ----- COUNTALL

id1 - - 1000 - - - - - 22

id1 - - - NULL - - - - 1

id2 - - - - 232 - - - 17

id3 - - - - 113 -- - - 2

id3 - - - - NULL - - 1

当我真的需要结果时:

ID ---- VALUE ----- COUNTALL

id1 - - 1000 - - - - - 23

id2 - - - - 232 - - - 17

id3 - - - - 113 -- - - 3

提前谢谢你!!!!

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:
    SELECT ID 
    ,SUM(CASE WHEN reason = 4 THEN 0 ELSE quantity*price END) AS Value
    ,COUNT(*) AS CountAll
    FROM TransactionsDB
    GROUP BY ID
    ORDER BY ID DESC
    

    【讨论】:

    • 嗨,理查德,我以前有过这个解决方案,但是我在 sum(case when....) 中使用了 SUM(quantity * price),这引发了错误。但这行得通,非常感谢:)!
    • 我删除了 DISTINCT,因为 GROUP BY 已经做了同样的事情。
    【解决方案2】:
    SELECT DISTINCT ID,
        SUM(CASE WHEN reason = 4 THEN 0 ELSE quantity*price END) AS Value,
        COUNT(*) AS CountAll
    FROM TransactionsDB
    GROUP BY ID
    ORDER BY ID DESC
    

    【讨论】:

    • 如果我错了请纠正我,但这与上面的答案完全一样吗?不管谢谢:)!
    猜你喜欢
    • 2023-03-15
    • 2018-04-26
    • 2019-04-19
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多