Sql server 在SQL中获取列中的前6项以透视到行
在SQL中获取要透视的列时遇到问题。我想将前6个结果从一列转到一行。我正在旋转的列可以有少于或多于6个结果开始,但我想忽略前6个以外的任何结果 我的Table1如下所示:Sql server 在SQL中获取列中的前6项以透视到行,sql-server,tsql,pivot,Sql Server,Tsql,Pivot,在SQL中获取要透视的列时遇到问题。我想将前6个结果从一列转到一行。我正在旋转的列可以有少于或多于6个结果开始,但我想忽略前6个以外的任何结果 我的Table1如下所示: ID | GroupID | CodeNum ---------------------- 1 | 1 | 111 2 | 1 | 222 3 | 1 | 333 4 | 1 | 444 5 | 1 | 555 6 | 1 | 666 7 |
ID | GroupID | CodeNum
----------------------
1 | 1 | 111
2 | 1 | 222
3 | 1 | 333
4 | 1 | 444
5 | 1 | 555
6 | 1 | 666
7 | 1 | 777
8 | 2 | 111
9 | 2 | 888
10 | 3 | 999
GroupID | Code1 | Code2 | Code3 | Code4 | Code5 | Code6
-------------------------------------------------------
1 | 111 | 222 | 333 | 444 | 555 | 666
2 | 111 | 888 | | | |
3 | 999 | | | | |
我希望我的输出如下所示:
ID | GroupID | CodeNum
----------------------
1 | 1 | 111
2 | 1 | 222
3 | 1 | 333
4 | 1 | 444
5 | 1 | 555
6 | 1 | 666
7 | 1 | 777
8 | 2 | 111
9 | 2 | 888
10 | 3 | 999
GroupID | Code1 | Code2 | Code3 | Code4 | Code5 | Code6
-------------------------------------------------------
1 | 111 | 222 | 333 | 444 | 555 | 666
2 | 111 | 888 | | | |
3 | 999 | | | | |
我尝试过以下代码:
SELECT GroupID
, [Code1] = CASE WHEN rn = 1 THEN CodeNum END
, [Code2] = CASE WHEN rn = 2 THEN CodeNum END
, [Code3] = CASE WHEN rn = 3 THEN CodeNum END
, [Code4] = CASE WHEN rn = 4 THEN CodeNum END
, [Code5] = CASE WHEN rn = 5 THEN CodeNum END
, [Code6] = CASE WHEN rn = 6 THEN CodeNum END
FROM (
SELECT TOP 6 GroupID
, rn = ROW_NUMBER() OVER (ORDER BY ID)
, CodeNum
FROM Table1
) q
GROUP BY
GroupID
但是我得到一个错误,说列'q.rn'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
当CodeNum每个GroupID可以有1到12个值时,有没有办法做到这一点?由于您使用的是
分组依据
,因此需要在中按所有项分组选择
或使用聚合函数
您将希望使用以下方法获得结果,然后将行透视到列中:
SELECT GroupID
, [Code1] = max(CASE WHEN rn = 1 THEN CodeNum END)
, [Code2] = max(CASE WHEN rn = 2 THEN CodeNum END)
, [Code3] = max(CASE WHEN rn = 3 THEN CodeNum END)
, [Code4] = max(CASE WHEN rn = 4 THEN CodeNum END)
, [Code5] = max(CASE WHEN rn = 5 THEN CodeNum END)
, [Code6] = max(CASE WHEN rn = 6 THEN CodeNum END)
FROM
(
SELECT GroupID
, rn = ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY ID)
, CodeNum
FROM Table1
) q
GROUP BY GroupID
看
您会注意到,我删除了前6个
,并按GroupId添加了一个分区
。如果使用TOP
,则仅返回第一个ID的值。分区将返回每个ID的行,但外部选择仅返回前6行
结果如下:
| GROUPID | CODE1 | CODE2 | CODE3 | CODE4 | CODE5 | CODE6 |
----------------------------------------------------------------
| 1 | 111 | 222 | 333 | 444 | 555 | 666 |
| 2 | 111 | 888 | (null) | (null) | (null) | (null) |
| 3 | 999 | (null) | (null) | (null) | (null) | (null) |
注意,根据您的SQL Server版本,也可以使用PIVOT
函数编写:
select GroupID,
[1] as Code1,
[2] as Code2,
[3] as Code3,
[4] as Code4,
[5] as Code5,
[6] as Code6
from
(
SELECT GroupID
, rn = ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY ID)
, CodeNum
FROM Table1
) d
pivot
(
max(codenum)
for rn in ([1], [2], [3], [4], [5], [6])
) piv;
请参见由于您使用的是
分组依据
,因此需要在中按所有项目分组选择
或使用聚合函数
您将希望使用以下方法获得结果,然后将行透视到列中:
SELECT GroupID
, [Code1] = max(CASE WHEN rn = 1 THEN CodeNum END)
, [Code2] = max(CASE WHEN rn = 2 THEN CodeNum END)
, [Code3] = max(CASE WHEN rn = 3 THEN CodeNum END)
, [Code4] = max(CASE WHEN rn = 4 THEN CodeNum END)
, [Code5] = max(CASE WHEN rn = 5 THEN CodeNum END)
, [Code6] = max(CASE WHEN rn = 6 THEN CodeNum END)
FROM
(
SELECT GroupID
, rn = ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY ID)
, CodeNum
FROM Table1
) q
GROUP BY GroupID
看
您会注意到,我删除了前6个
,并按GroupId添加了一个分区
。如果使用TOP
,则仅返回第一个ID的值。分区将返回每个ID的行,但外部选择仅返回前6行
结果如下:
| GROUPID | CODE1 | CODE2 | CODE3 | CODE4 | CODE5 | CODE6 |
----------------------------------------------------------------
| 1 | 111 | 222 | 333 | 444 | 555 | 666 |
| 2 | 111 | 888 | (null) | (null) | (null) | (null) |
| 3 | 999 | (null) | (null) | (null) | (null) | (null) |
注意,根据您的SQL Server版本,也可以使用PIVOT
函数编写:
select GroupID,
[1] as Code1,
[2] as Code2,
[3] as Code3,
[4] as Code4,
[5] as Code5,
[6] as Code6
from
(
SELECT GroupID
, rn = ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY ID)
, CodeNum
FROM Table1
) d
pivot
(
max(codenum)
for rn in ([1], [2], [3], [4], [5], [6])
) piv;
看