繁体   English   中英

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

[英]PIVOT with an extra 'else/default/fallback' column?

是否可以为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天过程的平均成本
  • 所有其他人的平均成本

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

我在MSDN上的T-SQL语法参考中没有看到任何这种可能性,我发现很难相信这是不可用的..它似乎是如此有用的功能和实现的微不足道,它只是伤害,省略它..

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

这个功能真的丢失了吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM