[英]SQL Server 2005 Pivot table is giving incorrect count value.
我被困在SQL Server 2005数据透视表查询中。
考虑以下表格和数据...
create table dbo.orders(orderid int primary key, customerid int, productid int, amount money, count int, quarter char(2))
insert into dbo.orders(orderid, customerid, productid, amount, count, quarter) values(1001, 9000, 20001, 5, 1, 'Q4')
insert into dbo.orders(orderid, customerid, productid, amount, count, quarter) values(1002, 9000, 20001, 10, 1, 'Q5')
insert into dbo.orders(orderid, customerid, productid, amount, count, quarter) values(1003, 9000, 20002, 15, 1, 'Q4')
insert into dbo.orders(orderid, customerid, productid, amount, count, quarter) values(1004, 9000, 20002, 20, 1, 'Q5')
您现在有了一个包含以下记录的表...
customerid productid amount count quarter
---------- --------- ------ ----- -------
9000 20001 5.00 1 Q4
9000 20001 10.00 1 Q5
9000 20002 15.00 1 Q4
9000 20002 20.00 1 Q5
现在我有以下透视查询...
select *
from
(
select o.customerid, o.productid, o.amount, o.count, o.quarter
from dbo.orders o (nolock)
)
src
pivot
(
sum(amount)
for quarter in([Q4], [Q5])
)piv
这将产生以下结果。
customerid productid count Q4 Q5
---------- --------- ------ ----- -------
9000 20001 1 5.00 10.00
9000 20002 1 15.00 20.00
问题是我的工作没了。 我希望结果看起来像这样...
customerid productid count Q4 Q5
---------- --------- ------ ----- -------
9000 20001 2 5.00 10.00
9000 20002 2 15.00 20.00
如果将计数用作枢轴值,则枢轴与productid相同。
我可以从查询中删除计数,并作为子查询进行计算,但随后我将被数据库访问两次。
是否有人对如何旋转和颠倒计数有想法?
谢谢
PIVOT运算符会将一列旋转为多列,并对所有其他列执行汇总。 因此,列(o.customerid,o.productid,o.amount)是隐式分组的。
我认为将PIVOT和GROUP BY结合使用可以为您提供所需的结果,如下所示:
WITH piv AS (
SELECT * FROM dbo.orders o (NOLOCK)
PIVOT (
SUM(amount) FOR quarter IN ([Q4], [Q5])
) d
)
SELECT customerid, productid, SUM(count) AS count,
SUM(Q4) AS Q4, SUM(Q5) AS Q5
FROM piv
GROUP BY customerid, productid;
CTE内部查询的第一部分将执行数据透视,但不会减少行数,因为o.orderid是唯一键,并且包含在隐式GROUP BY PIVOT运算符中。
外部查询将采用所需的PIVOTed行和GROUP BY列,即(客户ID,产品ID)。
不知道这是否是您尝试的Subquery
,但这是我想出的。
select customerid, productid
, (Select SUM(Count) From Orders O1
Where O1.productid = piv.productid
and O1.customerid = piv.customerid) [count]
, Q4, Q5
from
(
select o.customerid, o.productid, o.amount, o.count, o.quarter
from dbo.orders o (nolock)
)
src
pivot
(
sum(amount)
for quarter in([Q4], [Q5])
)piv
Group By customerid, productid, Q4, Q5
结果:
customerid productid count Q4 Q5
9000 20001 2 5.00 10.00
9000 20002 2 15.00 20.00
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.