我的2个SUM(CASE())示例有什么区别?

时间:2017-07-21 23:08:22

标签: sql-server tsql

所以我有2个查询,1个像我期望的那样工作,而另一个没有。这是一个像我期望的那样工作的,它是一个使用CASE语句的SUMIF:

SELECT
  PartNo,
  SUM(ActualPcsGood) AS Pcs,
  SUM(CASE WHEN Status = 'Current' THEN ActualPcsGood END) AS [Current],
  SUM(CASE WHEN Status = 'Pending' THEN ActualPcsGood END) AS [Pending],
  SUM(CASE WHEN Status = 'Future' THEN ActualPcsGood END) AS [Future],
  SUM(CASE WHEN Status = 'Finished' THEN ActualPcsGood END) AS [Finished]
FROM OrderRouting
WHERE PartNo LIKE '20004%'
GROUP BY PartNo;

输出:

enter image description here

现在我有另一个令我困惑的查询,这是代码:

SELECT
  JobNo,
  UnitPrice,
  SUM(CASE WHEN JobNo LIKE '10426%' THEN UnitPrice END) AS [OrderTotal]
FROM OrderDet
WHERE UnitPrice > 0
  AND JobNo LIKE '10426%'
GROUP BY JobNo, UnitPrice;

输出:

enter image description here

我的问题是为什么第3列与第二列完全相同?我的意图是第三列应该是整个事物的总和,这意味着第3列的值对于所有行都是完全相同的。为什么不呢?我的两个例子之间的主要区别是什么?

5 个答案:

答案 0 :(得分:1)

这还没有经过测试,但这里有一些想法:


select dtl.JobNo, dtl.UnitPrice, tot.UnitPrice SumPrice, (dtl.UnitPrice/tot.UnitPrice)*100 pctTot
from
(SELECT
  JobNo,
  UnitPrice
FROM OrderDet
WHERE UnitPrice > 0
  AND JobNo LIKE '10426%') dtl
cross join
(SELECT sum(UnitPrice) unitPrice
 FROM OrderDet 
 WHERE UnitPrice > 0
  AND JobNo LIKE '10426%') tot

OR

SELECT
  JobNo,
  UnitPrice,
  (select sum(UnitPrice) from OrderDet where UnitPrice > 0 and JobNo like '10426%') totPrice
FROM OrderDet
WHERE UnitPrice > 0
  AND JobNo LIKE '10426%'
GROUP BY JobNo;

答案 1 :(得分:0)

起初看起来一切都很好。我会说你的每个单位价格的记录数是这个记录集的每个作业一个。

添加COUNT(*)以查看总计记录的数量。

另一个想法是你在记录上有一个数量字段,你的case语句应该是:

SUM(CASE WHEN JobNo LIKE '10426%' THEN UnitPrice * Quantity END) AS [OrderTotal]

希望有所帮助。

答案 2 :(得分:0)

分组,对分组列中的值求和。您的分组列是Job和UnitPrice。因为你有一个独特的JobNo,UnitPrice,所以很难看出它在做什么。尝试在数据源中添加重复的UnitPrice,JobNo行,以便了解实际执行的操作。

我不确定你为什么要以这种方式显示总和。我会使用汇总来显示底部的总数。

答案 3 :(得分:0)

您的第一个查询仅按PartNo分组。所以你使用Case语句来为每个独特的PartNo工作。

然而,您的第二个查询按JobNo和UnitPrice分组。所以你的SUM运行为每组JobNo和UnitPrice,它只是单行。因此与UnitPrice相同。假设每个jobid作为唯一单价,请尝试下面的查询。你不需要在SUM中使用CASE,因为WHERE子句会处理它。

SELECT
  JobNo,
  MIN(UnitPrice) as UnitPrice,
  SUM(UnitPrice) AS [OrderTotal]
FROM OrderDet
WHERE UnitPrice > 0
  AND JobNo LIKE '10426%'
GROUP BY JobNo;

答案 4 :(得分:0)

但是,当您已按'10426%'条件过滤时,为什么要添加案例? 您的查询将仅返回'10426%'作为作业编号的记录。按作业编号分组,Unitprice将为您提供相同作业的不同单价的单行。下面的查询应该足够了。如果您使用'10426%'的单价不同,我们就无法在单行中获得单价。

SELECT
  JobNo,
  SUM(UnitPrice) AS [OrderTotal]
FROM OrderDet
WHERE UnitPrice > 0
  AND JobNo LIKE '10426%'
GROUP BY JobNo;