没有聚合的 Pivot Sql
Posted
技术标签:
【中文标题】没有聚合的 Pivot Sql【英文标题】:Pivot Sql with no aggregate 【发布时间】:2021-11-23 11:11:18 【问题描述】:我了解到如果没有聚合 max() 和 min(),我将无法旋转文本。
我正在尝试找出一种解决方法,但类似问题的答案却在我脑海中浮现。有人有解决方法的提示吗?
数据表:
pax | codex | mis |
---|---|---|
dog1 | hair | 10 |
dog1 | face | 10 |
dog1 | eye | 5 |
dog1 | smell | 7 |
dog1 | yellow | 7 |
dog1 | green | 8 |
dog1 | blue | 9 |
dog1 | tan | 10 |
想要的输出:
pax | 10 | 10 | 5 | 7 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|
dog1 | hair | face | eye | smell | yellow | green | blue | tan |
实际结果:
pax | 10 | 5 | 7 | 8 | 9 |
---|---|---|---|---|---|
dog1 | hair | eye | smell | green | blue |
我使用了这个代码:
DECLARE @cols AS NVARCHAR(MAX)='';
DECLARE @query AS NVARCHAR(MAX)='';
SELECT @cols = @cols + QUOTENAME(mis) + ',' FROM (select distinct mis from #dd) as tmp
select @cols = substring(@cols, 0, len(@cols)) --trim "," at end
set @query =
'SELECT * from
(
select pax,codex,mis from #dd
) src
pivot
(
max(codex) for mis in (' + @cols + ')
) piv'
execute(@query)
【问题讨论】:
【参考方案1】:试试这个
Select
pax,
concat(mis, '-', rn) as mis_new,
codex
from (
Select
pax,
mis,
row_number() over (partition by pax, mis
order by mis ) rn
from table
) t
pivot (
max(codex) for (
mis_new in ('10-1','10-2', '5-1','7-1','7-2','8-1','9-1','10-3')
) pvt
【讨论】:
收到此错误:函数“row_number”必须有一个带有 ORDER BY 的 OVER 子句。 现在检查它是否有效 感谢您的回复。我正在使用 MS SQL,也许这就是原因。我在枢轴附近收到不正确的语法错误。【参考方案2】:看起来像行号上的标准条件聚合会更好:
DECLARE @cols AS NVARCHAR(MAX) =
(
SELECT CONCAT(',MIN(CASE WHEN mis = ', QUOTENAME(mis, ''''), ' AND rn = ', rn, ' THEN codex END) ', QUOTENAME(mis))
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY pax ORDER BY mis) rn
FROM dd
) as tmp
GROUP BY mis, rn
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)');
DECLARE @query AS NVARCHAR(MAX) = '
SELECT
pax' + @cols + '
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY pax ORDER BY mis) rn
FROM dd
) dd
GROUP BY pax;
';
PRINT @query; --for testing
EXEC sp_executesql
@query;
db<>fiddle
注意使用
FOR XML
进行聚合。由于不可预测性,不应使用变量合并。
【讨论】:
效果很好,感谢大家的帮助!我还没有了解分区功能。我有很多东西要学。以上是关于没有聚合的 Pivot Sql的主要内容,如果未能解决你的问题,请参考以下文章