PIVOT 带有一个额外的“else/default/fallback”列?

que*_*atl 3 t-sql sql-server pivot

是否可以为 PIVOT 操作定义“回退”或“其他”情况?让我玩一下 MSDN 上的示例:

-- 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;
Run Code Online (Sandbox Code Playgroud)

枢轴行为非常明显 - 它在指定值列表的出现上选择/案例/组。我想看到的是一个“后备”案例。在上面的查询中,我想获取:

  • “即时” 0 天流程的平均成本
  • 1 天流程的平均成本
  • ...
  • 4 天流程的平均成本
  • 所有其他人的平均成本

请注意,“通缉”案件列表是固定的且已知的。我不想产生未知列数的枢轴。我只想将所有不匹配的值分组为名为“其他”的简单结果

我在MSDN上的 T-SQL 语法参考中没有看到任何这样的可能性,我只是发现很难相信这是不可用的..这似乎是非常有用的功能并且实现起来很简单,以至于忽略它只是伤害..

是的,我知道它可能会讨论是否以及如何处理出现在“其他”中的 NULL 值,但这只是两种特殊情况……它们可以像在任何聚合函数中一样被忽略——这对实现,并且 100% 精细并与 SQL 的其余部分保持一致——或者可以由两个不同的回退关键字处理,例如 ELSE-NOT-NULL 与 ELSE-OR-NULL ..

真的没有这个功能吗?

Tar*_*ryn 5

不幸的是,这是不可能放置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
Run Code Online (Sandbox Code Playgroud)

参见SQL Fiddle with Demo