2017-06-13 92 views
2

很長一段時間聽衆,第一次來電者...新手SQL查詢透視

我有一個表(跟蹤)按照以下幾點:

ID | Works Order |Activity |Status 
---|----------------|-----------|------ 
1 | W123456789-001 |10A  |GOOD 
2 | W123456789-002 |10A  |GOOD 
3 | W123456789-003 |10A  |SCRAP 
4 | W123456789-001 |20A  |GOOD 
5 | W123456789-002 |20A  |GOOD 

...其中工程訂單號W123456789- 001由實際工單號組成; W123456789,然後是部件號; 001.'Activites'被固定爲10A,20A,30A & 110A,狀態是'好的'或'碎片'。我想總結&輸出它像下面這樣:

Works Order |10A |20A |30A |110A 
-------------|----|----|----|---- 
W123456789 |2 |2 |0 |0  

...其中的cols 10,20,30 & 110A的數量是「良好的每個活動的次數。

我可以通過下面的代碼獲得大部分的方法;

select [WO_Part],[10A G],[20A G],[30A G],[110AG] 
from 
(
    select 
    [Activity], 
    LEFT([WOPart],10) AS [WO_Part], 
    iIf([Status]='GOOD ',1,0) AS [STATUS], 
    [ACTIVITY]+LEFT([STATUS],1) AS [CONCAT] 
    from Tracker 
) d 
pivot 
(
    SUM([Status]) 
    for [CONCAT] in ([10A G],[20A G],[30A G],[110AG]) 
) piv; 

但是,我得到的每廠訂單多行的結果分佈在每個活動一排,象下面這樣:

Works Order |10A |20A |30A |110A 
-------------|----|----|----|---- 
W123456789 |2 |0 |0 |0 
W123456789 |0 |2 |0 |0 

我應該如何改變我的查詢,以便將結果合併在一個單一行?

Works Order |10A |20A |30A |110A 
-------------|----|----|----|---- 
W123456789 |2 |2 |0 |0 

預先感謝您!

回答

1

對於pivotFROM子句中的額外列會導致額外的行。所以你需要小心你的選擇:

select [WO_Part], [20A G],[30A G],[110AG] 
from (select LEFT([WOPart], 10) AS [WO_Part], 
      (case when [Status] = 'GOOD ' then 1 else 0 end) AS [STATUS], 
      [ACTIVITY]+LEFT([STATUS],1) AS [CONCAT] 
     from Tracker 
    ) d 
pivot (SUM([Status]) 
     for [CONCAT] in ([20A G],[30A G],[110AG]) 
    ) piv; 

這種行爲是我喜歡條件聚合的原因之一。

+0

很好,謝謝戈登。我是SQL新手,爲了跟上我的僱主的要求,正在進行自我教育。諸如你的建議非常寶貴。謝謝! – John