SQL Server 2005 Pivot table 给出的计数值不正确。
SQL Server 2005 Pivot table is giving incorrect count value.
我被困在 SQL Server 2005 枢轴 table 查询上。
考虑以下 table 和数据...
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')
您现在有一个 table,其中包含以下记录...
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 相同的枢轴值的枢轴值。
我可以从查询中删除计数并作为子查询进行计算,但这样我会访问数据库两次。
有人知道如何旋转和倒数吗?
谢谢
不确定这是否是您尝试的 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
PIVOT 运算符会将一列旋转为多列,并对所有其他列执行聚合。因此,列 (o.customerid、o.productid、o.amount) 隐式 GROUPed BY。
我认为结合 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 是唯一键并且包含在 PIVOT 运算符执行的隐式 GROUP BY 中。
外部查询将采用 PIVOTed 行和 GROUP BY 您想要的列,即 (customerid, productid)。
我被困在 SQL Server 2005 枢轴 table 查询上。
考虑以下 table 和数据...
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')
您现在有一个 table,其中包含以下记录...
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 相同的枢轴值的枢轴值。
我可以从查询中删除计数并作为子查询进行计算,但这样我会访问数据库两次。
有人知道如何旋转和倒数吗?
谢谢
不确定这是否是您尝试的 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
PIVOT 运算符会将一列旋转为多列,并对所有其他列执行聚合。因此,列 (o.customerid、o.productid、o.amount) 隐式 GROUPed BY。
我认为结合 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 是唯一键并且包含在 PIVOT 运算符执行的隐式 GROUP BY 中。
外部查询将采用 PIVOTed 行和 GROUP BY 您想要的列,即 (customerid, productid)。