gpt4 book ai didi

SQL Server : Columns to Rows

转载 作者:行者123 更新时间:2023-12-01 16:47:44 25 4
gpt4 key购买 nike

寻找优雅的(或任何)解决方案将列转换为行。

这是一个示例:我有一个具有以下架构的表:

[ID] [EntityID] [Indicator1] [Indicator2] [Indicator3] ... [Indicator150]

这是我想要得到的结果:

[ID] [EntityId] [IndicatorName] [IndicatorValue]

结果值为:

1 1 'Indicator1' 'Value of Indicator 1 for entity 1'
2 1 'Indicator2' 'Value of Indicator 2 for entity 1'
3 1 'Indicator3' 'Value of Indicator 3 for entity 1'
4 2 'Indicator1' 'Value of Indicator 1 for entity 2'

等等..

这有道理吗?对于在哪里查找以及如何在 T-SQL 中完成它,您有什么建议吗?

最佳答案

您可以使用UNPIVOT将列转换为行的函数:

select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in (Indicator1, Indicator2, Indicator3)
) unpiv;

请注意,您要取消透视的列的数据类型必须相同,因此您可能必须在应用取消透视之前转换数据类型。

您还可以使用CROSS APPLY 和 UNION ALL 来转换列:

select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
select 'Indicator1', Indicator1 union all
select 'Indicator2', Indicator2 union all
select 'Indicator3', Indicator3 union all
select 'Indicator4', Indicator4
) c (indicatorname, indicatorvalue);

根据您的 SQL Server 版本,您甚至可以将 CROSS APPLY 与 VALUES 子句一起使用:

select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
values
('Indicator1', Indicator1),
('Indicator2', Indicator2),
('Indicator3', Indicator3),
('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);

最后,如果您有 150 列需要取消透视,并且您不想对整个查询进行硬编码,那么您可以使用动态 SQL 生成 sql 语句:

DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)

select @colsUnpivot
= stuff((select ','+quotename(C.column_name)
from information_schema.columns as C
where C.table_name = 'yourtable' and
C.column_name like 'Indicator%'
for xml path('')), 1, 1, '')

set @query
= 'select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in ('+ @colsunpivot +')
) u'

exec sp_executesql @query;

关于SQL Server : Columns to Rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18026236/

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