2017-06-13 79 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