没有聚合的 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的主要内容,如果未能解决你的问题,请参考以下文章

同一列上具有多个聚合的 T-SQL Pivot

SQL 连接,使用 Pivot 聚合

SQL Server PIVOT - 多个聚合

具有动态生成列、聚合函数和无聚合列的 SQL Pivot

在 SQL Pivot 上使用 Min 聚合

具有 SUM、COUNT 或聚合结果的动态列的 SQL Pivot