gpt4 book ai didi

sql - PIVOTing可变数量的行到列

转载 作者:行者123 更新时间:2023-12-04 20:29:13 25 4
gpt4 key购买 nike

我目前正在尝试将一些行转为列。问题是我并不总是知道有多少行可用。让我们看一个例子:

Values_Table                         Columns_Table
------------ -----------
ID ID
ColumnsTableID GroupID
Value ColumnName

结果”

Columns_Table
---------------
ID | GroupID | ColumnName
---------------------------------
0 1 Cats
1 1 Dogs
2 1 Birds
3 2 Pontiac
4 2 Ford
5 3 Trex
6 3 Raptor
7 3 Triceratops
8 3 Kentrosaurus

静态数据透视表的 SQL FIDDLE 示例。我正在尝试实现动态枢轴 - http://sqlfiddle.com/#!3/2be82/1

因此,这是我的困境:在这种情况下,我希望能够基于 GroupID 来旋转未知数量的列。

例如,我希望能够将 GroupID 3 中的所有行旋转到列中。我需要在不知道 groupID 3 中有多少行的情况下执行此操作。

数据库的设计是一成不变的,所以我对此无能为力。我所能做的就是利用我所拥有的:(

那么,就是说 - 有没有人对如何完成将未知数量的行插入到列中的任务有任何建议,在此示例中,基于 groupID?

最佳答案

如果您不想提前知道这些值,那么您需要考虑使用 dynamic SQL .这将创建一个将被执行的 SQL 字符串,这是必需的,因为在运行查询时必须知道列的列表。

代码类似于:

DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@groupid as int

set @groupid = 3

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(GroupName)
from Columns_Table
where groupid = @groupid
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')

set @query = 'SELECT ' + @cols + '
from
(
SELECT B.GroupName, A.Value
, row_number() over(partition by a.ColumnsTableID
order by a.Value) seq
FROM Values_Table AS A
INNER JOIN Columns_Table AS B
ON A.ColumnsTableID = B.ID
where b.groupid = '+cast(@groupid as varchar(10))+'
) p
pivot
(
min(P.Value)
for P.GroupName in (' + @cols + ')
) p '

execute sp_executesql @query;

参见 SQL Fiddle with Demo .对于 3 的 groupid,则结果将是:

|   KENTROSAURUS |     RAPTOR |     TREX |    TRICERATOPS |
| whatisthiseven | Itsaraptor | Jurassic | landbeforetime |
| (null) | zomg | Park | (null) |

关于sql - PIVOTing可变数量的行到列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18875796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com