【问题标题】:SQL Server 2005 Pivot table is giving incorrect count value.SQL Server 2005 数据透视表给出的计数值不正确。
【发布时间】:2018-04-12 19:49:08
【问题描述】:

我遇到了 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 相同的枢轴值,则为枢轴。

我可以从查询中删除计数并作为子查询进行计算,但是我会两次访问数据库。

有没有人知道如何调整和颠倒计数?

谢谢

【问题讨论】:

    标签: sql sql-server-2005 pivot


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      不确定这是否是您为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
      

      【讨论】:

        猜你喜欢
        • 2012-02-22
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        相关资源
        最近更新 更多