2013-02-01 12 views
2

是否可以爲PIVOT操作定義「後退」或「其他」情況?讓我與樣品從MSDN玩:PIVOT有額外的'else/default/fallback'列嗎?

-- Pivot table with one row and five columns 
SELECT 
    'AverageCost' AS Cost_Sorted_By_Production_Days, 
    [0], [1], [2], [3], [4], 
    [??magicalELSEkeyword??] as 'too many days' 

FROM 
(
    SELECT DaysToManufacture, StandardCost 
    FROM Production.Product 
) AS SourceTable 

PIVOT 
(
    AVG(StandardCost) 
    FOR DaysToManufacture IN 
    (
     [0], [1], [2], [3], [4], 
     [??magicalELSEkeyword??] 
    ) 
) AS PivotTable; 

樞軸行爲是相當明顯的 - 它選擇/箱/過值的指定列表的出現次數組。我想看到的是一個「後備」案例。在上面的查詢,我想取:

  • 平均成本爲「瞬間」 0天的過程
  • 平均成本爲1天的過程
  • ...
  • 的平均成本爲期4天的過程
  • 所有其他

平均成本請注意,案件清單「通緝令」是恆定的,衆所周知。我不想產生一個未知數列的關鍵點。我只想將所有不匹配的值分組爲簡單的結果命名爲「其他」

我還沒有看到任何這種可能性在MSDN的T-SQL語法參考中,我很難相信這是不可用的。 。它似乎是這樣有用的功能和微不足道的實施,它只是傷害忽略它..

是的,我知道它可能會引入討論是否以及如何處理出現在'其他',但這只是兩種特殊情況......它們可以被忽略,就像在任何聚合函數中那樣 - 實現起來微不足道,並且100%很好並與其他SQL保持一致 - 或者可以由兩個不同的後備關鍵字處理,如ELSE-NOT-NULL與ELSE-OR-NULL ..

此功能是否真的缺失?

回答

3

不幸的是,不可能將other放在ELSE語句中,所以我會將CASE放入子查詢中。然後你會PIVOT這些新的價值觀:

select * 
from 
(
    select StandardCost, 
    case DaysToManufacture 
     when 0 then '0' 
     when 1 then '1' 
     when 2 then '2' 
     when 3 then '3' 
     when 4 then '4' 
     else 'Others' end as DaysToManufacture 
    from Product 
) src 
pivot 
(
    avg(StandardCost) 
    for DaysToManufacture in ([0], [1], [2], [3], [4], [Others]) 
) piv 

SQL Fiddle with Demo