【问题标题】:How to Pivot in SQL, grouped in 3 columns with '000s of values如何在 SQL 中进行透视,用 \'000s 值分组在 3 列中
【发布时间】:2023-01-17 01:08:59
【问题描述】:

我正在尝试在 SQL 中使用 pivot 函数。透视列具有“000”个值,但每行不超过 3 个

原始查询显示;

ID Name ThemeID
11 Game A 44
11 Game A 791
11 Game A 1422
23 Game B 42
23 Game B 285
23 Game B 1256

我需要的;

ID Name ThemeID1 ThemeID2 ThemeID3
11 Game A 44 791 1422
23 Game B 42 285 1256

【问题讨论】:

  • 您是否已经尝试过对其进行一些查询?
  • 从外观上看,您需要以 ROW_NUMBER 的值为中心

标签: sql sql-server


【解决方案1】:

这是一个使用条件聚合的选项。我们同样使用窗函数row_number() over()来计算行列号

注意:我添加了Game B - 1500来说明“溢出”

例子

Declare @YourTable Table ([ID] int,[Name] varchar(50),[ThemeID] int)  Insert Into @YourTable Values 
 (11,'Game A',44)
,(11,'Game A',791)
,(11,'Game A',1422)
,(23,'Game B',42)
,(23,'Game B',285)
,(23,'Game B',1256)
,(23,'Game B',1500)  -- Added to illustrate more than 3

Select ID
      ,Name
      ,ThemeID1 = max(case when CN = 1 then ThemeID end)
      ,ThemeID2 = max(case when CN = 2 then ThemeID end)
      ,ThemeID3 = max(case when CN = 0 then ThemeID end)
 From ( 
        Select * 
              ,RN = (row_number() over (partition by ID,Name order by ThemeID)-1) / 3
              ,CN = row_number() over (partition by ID,Name order by ThemeID) % 3
         From @YourTable
      ) A
 Group By ID,Name,RN

结果

ID  Name    ThemeID1    ThemeID2    ThemeID3
11  Game A  44          791         1422
23  Game B  42          285         1256
23  Game B  1500        NULL        NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2017-10-19
    • 2023-04-08
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多