繁体   English   中英

SQL Server 2005数据透视表提供的计数值不正确。

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM