【发布时间】:2015-08-31 11:51:13
【问题描述】:
我正在尝试创建一个查询,该查询将以某些行为中心,但会SUM 某些列,然后将它们组合在一起。我之前使用过PIVOT 函数,但是当我的结果集包含相似的值时我遇到了问题。
这是 SQL Server 2012。
示例代码:
CREATE TABLE #Foo
(
Store varchar(50),
Employee varchar(50),
Sold money,
Waste money,
Tmsp datetime
)
INSERT INTO #Foo
VALUES
('Harrisburg', 'John', 20.00, 10.00, GETDATE()),
('Harrisburg', 'John', 20.00, 10.00, GETDATE()),
('Harrisburg', 'Jim', 20.00, 10.00, GETDATE()),
('Seattle', 'Jim', 20.00, 10.00, GETDATE()),
('Seattle', 'Alex', 20.00, 10.00, GETDATE())
SELECT
Store,
SUM(Sold) TotalSold,
SUM([John]) WastedByJohn,
SUM([Jim]) WastedByJim,
SUM([Alex]) WastedByAlex
FROM
#Foo
PIVOT
(SUM(Waste)
FOR Employee IN ([John], [Jim], [Alex])
) PVT
GROUP BY
Store
DROP TABLE #Foo
这会产生以下结果:
Store | TotalSold | WastedByJohn | WastedByJim | WastedByAlex
Harrisburg | 20.00 | 20.00 | 10.00 | NULL
Seattle | 20.00 | NULL | 10.00 | 10.00
根据表中的数据,Harrisburg 的 TotalSold 是否应该是 60.00 而西雅图的 TotalSold 应该是 40.00?
这让我更难理解了,因为如果我更改数据以使值不一样,我会得到正确的结果。
INSERT INTO #Foo
VALUES
('Harrisburg', 'John', 25.00, 10.00, GETDATE()),
('Harrisburg', 'John', 30.00, 10.00, GETDATE()),
('Harrisburg', 'Jim', 40.00, 10.00, GETDATE()),
('Seattle', 'Jim', 50.00, 10.00, GETDATE()),
('Seattle', 'Alex', 60.00, 10.00, GETDATE())
这组数据产生了预期的结果:
Store | TotalSold | WastedByJohn | WastedByJim | WastedByAlex
Harrisburg | 95.00 | 20.00 | 10.00 | NULL
Seattle | 110.00 | NULL | 10.00 | 10.00
我环顾四周,找不到关于为什么 PIVOT 在聚合时会根据不同的值而有所不同的答案。我觉得这里缺少一些基本的东西,除非我碰巧遇到了一些不太可能的 SQL Server 问题。
任何帮助将不胜感激。
谢谢!
【问题讨论】:
-
您如何在预期输出中获得 95 和 110 的总值?应该是 40 和 60 ,,, 不应该吗????
-
我希望它是“Sold”的 SUM 值,按商店分组。在第一个示例中,我预计哈里斯堡为 20+20+20 = 60,西雅图为 20+20=40。由于所有行的“Sold”值相同 (20.00),某些东西似乎无法正常工作。对于第二个数据集,“Sold”的值不同,并且总和工作正常(哈里斯堡为 25+30+40=95,西雅图为 50+60=110)
标签: sql-server sql-server-2012 pivot distinct aggregate-functions