【问题标题】:PIVOT with an extra 'else/default/fallback' column?带有额外的“其他/默认/后备”列的 PIVOT?
【发布时间】:2013-01-16 23:04:04
【问题描述】:

是否可以为 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;

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

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

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

我在MSDN 上的 T-SQL 语法参考中没有看到任何这种可能性,我只是觉得很难相信这是不可用的。它似乎是如此有用且实现起来微不足道,以至于忽略它会很痛苦..

是的,我知道它可能会引入一个讨论是否以及如何处理出现在“其他”中的 NULL 值,但这只是两种特殊情况..它们可以像在任何聚合函数中一样被忽略——这将实现起来很简单,并且 100% 良好并且与 SQL 的其余部分保持一致——或者可以通过两个不同的备用关键字来处理,例如 ELSE-NOT-NULL 与 ELSE-OR-NULL..

真的缺少这个功能吗?

【问题讨论】:

    标签: sql-server tsql pivot


    【解决方案1】:

    不幸的是,不能将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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2011-11-08
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      相关资源
      最近更新 更多