是否可以为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。我希望看到的是一个“后备”案例。在上面的查询中,我想要获取:
请注意,“通缉”的案例列表是不变的并且是已知的。我不想生成未知列数的轴。我只想将所有不匹配的值分组为名为“others”的简单结果
我在MSDN的T-SQL语法参考中没有看到任何这种可能性,我发现很难相信这是不可用的..它似乎是如此有用的功能,并且实现起来很简单,要省略它只是伤害..
是的,我知道它可能会引入讨论是否以及如何处理出现在'other'中的NULL值,但这只是两个特殊情况......它们可以像任何聚合函数一样被忽略 - 那就是实现起来很简单,100%很好并与SQL的其余部分保持一致 - 或者可以由两个不同的回退关键字处理,如ELSE-NOT-NULL与ELSE-OR-NULL ..
这个功能真的丢失了吗?
答案 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