2017-10-31 13 views
0

SQL Server 2005のピボットテーブルクエリが停止しています。SQL Server 2005ピボットテーブルでカウント値が正しくありません。

...今私は、次のピボットクエリを持って

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 

...あなたは今、次のレコードを持つテーブルがある

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

... follwing表とデータを考えてみましょう

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と同じです。

私はクエリからカウントを削除し、サブクエリとして計算することができましたが、データベースを2回ヒットします。

誰もピボットを起こしカウントを狂わせる方法を知っていますか?

が、これはあなたがSubqueryのためにしようとしたものですが、ここで私が思い付いたかどう

答えて

3

PIVOT演算子は、複数の列への列を回転すると、他のすべての列に対して集計を実行します。したがって、列(o.customerid、o.productid、o.amount)は暗黙的にGROUPされます。

私はそうのようPIVOTおよびGROUP BYを組み合わせること、あなたが望む結果を与えることができると思います

:CTE内部クエリの

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; 

最初の部分は、旋回を行いますが、数を減らすことはありませんo.orderidは一意のキーであり、暗黙のGROUP BYに含まれているため、PIVOT演算子は行を処理しません。

外側のクエリでは、PIVOTされた行とGROUP BYという必要な列、つまり(customerid、productid)が使用されます。

1

わからないありがとうございました。

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 
関連する問題