所以我有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;
输出:
现在我有另一个令我困惑的查询,这是代码:
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;
输出:
我的问题是为什么第3列与第二列完全相同?我的意图是第三列应该是整个事物的总和,这意味着第3列的值对于所有行都是完全相同的。为什么不呢?我的两个例子之间的主要区别是什么?
答案 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;