PIVOT有一个额外的'else / default / fallback'列?

时间:2013-02-01 15:29:29

标签: sql-server tsql 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;

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

  • '瞬时'0天过程的平均成本
  • 1天流程的平均费用
  • ...
  • 4天流程的平均费用
  • 所有其他
  • 的平均费用

请注意,“通缉”的案例列表是不变的并且是已知的。我不想生成未知列数的轴。我只想将所有不匹配的值分组为名为“others”的简单结果

我在MSDN的T-SQL语法参考中没有看到任何这种可能性,我发现很难相信这是不可用的..它似乎是如此有用的功能,并且实现起来很简单,要省略它只是伤害..

是的,我知道它可能会引入讨论是否以及如何处理出现在'other'中的NULL值,但这只是两个特殊情况......它们可以像任何聚合函数一样被忽略 - 那就是实现起来很简单,100%很好并与SQL的其余部分保持一致 - 或者可以由两个不同的回退关键字处理,如ELSE-NOT-NULL与ELSE-OR-NULL ..

这个功能真的丢失了吗?

1 个答案:

答案 0 :(得分: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