[英]SQL SUM group with condition
我有SQL Server表名tbInvoice看起来像这样:
我对结果的期望是这样的:
我们的想法是从total_inv + total_1 + total_2计算GRAND TOTAL,其中状态为0(status_inv,status_1,status_2)为VENDOR所有行组。
我做了这样的事情,但没有奏效:
SELECT DISTINCT vendor,
SUM(CASE WHEN total_inv = 0 AND total_1 = 0, and total_2 = 0 THEN (total_inv + total_1 + total_2)
WHEN total_inv = 0 AND total_1 = 0, and total_2 = 1 THEN (total_inv + total_1)
WHEN total_inv = 0 AND total_1 = 1, and total_2 = 0 THEN (total_inv + total_2)
WHEN total_inv = 0 AND total_1 = 1, and total_2 = 1 THEN (total_inv)
WHEN total_inv = 1 AND total_1 = 0, and total_2 = 0 THEN (total_1 + total_2)
WHEN total_inv = 1 AND total_1 = 0, and total_2 = 1 THEN (total_1)
WHEN total_inv = 1 AND total_1 = 1, and total_2 = 0 THEN (total_2)
WHEN total_inv = 1 AND total_1 = 1, and total_2 = 1 THEN 0 END) GRAND TOTAL FROM tbInvoice GROUP BY vendor
非常感谢你。
您在CASE表达式中混淆了状态和总计。 而且,你使它变得比必要的更复杂。 您希望在状态为0时累加总计:
SELECT
vendor,
SUM(CASE WHEN status_inv = 0 THEN total_inv ELSE 0 END) +
CASE WHEN status_1 = 0 THEN total_1 ELSE 0 END) +
CASE WHEN status_2 = 0 THEN total_2 ELSE 0 END)) AS grand_total
FROM tbInvoice
GROUP BY vendor
ORDER BY vendor;
没有任何数学技巧;-)
你想到的表达式更容易:
SELECT vendor,
sum( total_inv + total_1 * status_1 + total_2 * status_2) GRAND TOTAL
FROM tbInvoice
GROUP BY vendor
说明
在某些情况下(当status = 0时),您不希望将值聚合到总计,在其他情况下(当status = 1时)您想要。 然后,它就像使用value * status
一样简单,因为value * 0 = 0
且value * 1 = value
。
供您参考
不建议使用 Stack Overflow 屏幕截图 ,最好使用简单的复制粘贴文本。 另外,我恭喜您将您的工作发布到解决方案中。
编辑
从OP评论看起来我应该切换status
字段。
SELECT vendor,
sum( total_inv * (1-status_inv)
+ total_1 * (1-status_1)
+ total_2 * (1-status_2)
) as GRAND TOTAL
FROM tbInvoice
GROUP BY vendor
希望这会有所帮助,在这里我得到所有总数的总和并在乘以状态后减去总数,以便消除状态为1的那个,我选择此方法来保持此SQL代码ANSI,
SELECT vendor,
SUM( total_inv + total_1 + total_2 -( total_inv*status_inv + total_1 * status_1 + total_2 * status_2)) as GRAND TOTAL
FROM tbInvoice
GROUP BY vendor
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.