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)。