2016-08-26 18 views
-1

次のピボットで行が繰り返されます。 Emp Nameは、下の図のように3回繰り返されます。私も注文を使用する場合、同じ結果を得た。私は何の間違いをしたのですか?どうすれば正しい出力を得ることができますか?誰でも私を助けることができますか?私はTicketStatus列&ピボットを削除した場合、私は所望の出力を得ることができますSQL Server PIVOTテーブルのGROUP BY

SELECT 
    * 
FROM 
    (SELECT 
     e.EmpName, ClaimSource, TicketStatus 
    FROM 
     ClaimMaster c 
    INNER JOIN 
     Allocation a ON c.ClaimMasterId = a.ClaimMasterId 
    INNER JOIN 
     myUsers..EmpMaster e ON a.AllocatedToEmpId = e.AspUsername 
    WHERE 
     TicketStatus IN ('First Review','Calling Pending','Analyst Action','Recalling') 
    ) m 
PIVOT (
    COUNT(ClaimSource) 
    FOR ClaimSource IN ([Aging Report],[Appeal],[Denied],[Rejected],[Special Project],[Eligibility],[Correspondence]) 
) n 
PIVOT (
    COUNT(TicketStatus) 
    FOR TicketStatus IN ([Recalling]) 
) o 

enter image description here

所望の出力

enter image description here

(SQL Server 2012の使用)。

+1

「私は間違いました。私は正しい出力を得ることができますか?正しい*出力は*何ですか?* – Siyual

+0

いくつかのテストデータを使用して再生する例は私たち自身で作成しないでください。また、あなたの望む結果が何であるかを示してください。 http://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql-question/271056 – Matt

+0

@mattが出力画像を追加しました。どのように私はここにデータを表示することができます、私は44行 – Aruna

答えて

0

TicketStatusカラム&ピボットを削除しても、希望の出力を得ることができます。

+0

が、これは希望の出力ですか?結果セットにRecalling列があり、何かがリコールされたときにカウントすることを示しています。そのような場合は、2番目のピボットとチケットのステータスを提案どおりにドロップします。あなたがリコールの列をしたい場合は、何が起こっているのか把握するために私の答えをお読みください – Matt

0

まず、条件付き集計を使用して、両方の条件を同時に集計することをお勧めします。

SELECT 
    e.EmpName 
    ,COUNT(CASE WHEN ClaimSource = 'Aging Report' THEN ClaimSource END) as [Aging Report] 
    ,COUNT(CASE WHEN ClaimSource = 'Appeal' THEN ClaimSource END) as [Appeal] 
    ,COUNT(CASE WHEN ClaimSource = 'Denied' THEN ClaimSource END) as [Denied] 
    ,COUNT(CASE WHEN ClaimSource = 'Rejected' THEN ClaimSource END) as [Rejected] 
    ,COUNT(CASE WHEN ClaimSource = 'Special Project' THEN ClaimSource END) as [Special Project] 
    ,COUNT(CASE WHEN ClaimSource = 'Eligibility' THEN ClaimSource END) as [Eligibility] 
    ,COUNT(CASE WHEN ClaimSource = 'Correspondence' THEN ClaimSource END) as [Correspondence] 
    ,COUNT(CASE WHEN TicketStatus = 'Recalling' THEN TicketStatus END) as [Recalling] 
FROM ClaimMaster c 
    INNER JOIN Allocation a ON c.ClaimMasterId = a.ClaimMasterId 
    INNER JOIN myUsers..EmpMaster e ON a.AllocatedToEmpId = e.AspUsername 
WHERE TicketStatus IN ('First Review','Calling Pending','Analyst Action','Recalling') 
GROUP BY 
    e.EmpName 

あなたは、本質的にそれを行うことはできませんClaimSourceとTicketStatus PIVOTに基づいて集計の2つの異なる種類をやろうとしています。実際に何が起こっているか最初のPivotはチケットステータスがまだ残っているため、余分な行を作成します。次に、その列がピボットされてカウントされ、それを落とす次のピボットただし、他の列がすべて存在するため、実際には集計は実行されません。私はあなたの従業員がRecallingTicketStatusを持っていないというデータのイメージから推測することができます。

SELECT 
    EmpName 
    ,SUM([Aging Report]) as [Aging Report] 
    ,SUM([Appeal] as [Appeal] 
    ,SUM([Denied]) as [Denied] 
    ,SUM[Rejected]) as [Rejected] 
    ,SUM([Special Project]) as [Special Project] 
    ,SUM([Eligibility]) as [Eligibility] 
    ,SUM([Correspondence]) as [Correspondence] 
    ,COUNT(Recalling) as Recalling 
FROM (
    SELECT e.EmpName, ClaimSource, TicketStatus FROM ClaimMaster c 
    INNER JOIN Allocation a ON c.ClaimMasterId = a.ClaimMasterId 
    INNER JOIN myUsers..EmpMaster e ON a.AllocatedToEmpId = e.AspUsername 
    WHERE TicketStatus IN ('First Review','Calling Pending','Analyst Action','Recalling') 
) m 
PIVOT (
    COUNT(ClaimSource) 
    FOR ClaimSource IN ([Aging Report],[Appeal],[Denied],[Rejected],[Special Project],[Eligibility],[Correspondence]) 
) n 
GROUP BY 
    EmpName 

それとも、より簡単にClaimSourceのためのピボットを行い、標準の集約を行うと呼び出しのために参加するだけ:代わりにあなたが凝集の第二ラウンドを行うことが二回目の回動。しかし、あなたがこれを行うならば、従業員IDを代わりに持ち歩くことを提案するでしょう。

SELECT * 
FROM 
    (SELECT * 
     FROM (
      SELECT e.EmpName, ClaimSource FROM ClaimMaster c 
      INNER JOIN Allocation a ON c.ClaimMasterId = a.ClaimMasterId 
      INNER JOIN myUsers..EmpMaster e ON a.AllocatedToEmpId = e.AspUsername 
      WHERE TicketStatus IN ('First Review','Calling Pending','Analyst Action') 
     ) m 
     PIVOT (
      COUNT(ClaimSource) 
      FOR ClaimSource IN ([Aging Report],[Appeal],[Denied],[Rejected],[Special Project],[Eligibility],[Correspondence]) 
     ) n 
    ) t 
    INNER JOIN (
     SELECT 
      SELECT e.EmpName, COUNT(TicketStatus) as Recalling FROM ClaimMaster c 
      INNER JOIN Allocation a ON c.ClaimMasterId = a.ClaimMasterId 
      INNER JOIN myUsers..EmpMaster e ON a.AllocatedToEmpId = e.AspUsername 
      WHERE TicketStatus IN ('Recalling') 
    ) t2 
    ON T1.EmpName = t2.EmpName 

これを解決するには、クエリの各部分を順番に実行します。結果を1ピボットで見るようにしてください。 TicketStatusを使用すると、これを済ませたらフラグを立てたはずです。