带条件的SQL SUM组

时间:2019-02-21 10:22:16

标签: sql sql-server

我有SQL Server表名tbInvoice看起来像这样:

enter image description here

我对结果的期望是这样的:

enter image description here

该想法是根据VENDOR对所有行进行分组,根据total_inv + total_1 + total_2来计算GRAND TOTAL。状态为0(status_inv,status_1,status_2)。

我做了类似的事情,但是没用:

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  

非常感谢您。

3 个答案:

答案 0 :(得分:3)

您在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;

没有任何数学技巧;-)

答案 1 :(得分:2)

如您所愿,表达更简单:

SELECT vendor, 
       sum( total_inv + total_1 * status_1 + total_2 * status_2) GRAND TOTAL 
FROM tbInvoice 
GROUP BY vendor

说明

在某些情况下(状态为0时),您不想将值聚合为总计;在其他情况下(状态为1时),您想要。然后,就像使用value * status一样容易,因为value * 0 = 0value * 1 = value

供您参考

在堆栈溢出screenshots are discouraged上,最好使用简单的复制粘贴文本。另外,我也恭喜您将您的工作发布到解决方案中。

已编辑

从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

答案 2 :(得分:0)

希望这会有所帮助,在这里我得到所有总数的总和,然后乘以状态,然后减去总和,从而消除状态为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