SQL将带有UniqueID +多个键值对的表转换为行
Posted
技术标签:
【中文标题】SQL将带有UniqueID +多个键值对的表转换为行【英文标题】:SQL to convert table w/ UniqueID + multiple key value pairs into rows 【发布时间】:2018-01-10 00:20:13 【问题描述】:我有一个数据表:
UniqueID |key1 |value1|key2|value2|
123 |1 |a |2 |c
234 |1 |b |2 |d
我希望它是:
UniqueID|key|value
123 |1 |a
234 |1 |b
123 |2 |c
234 |2 |d
尝试在 SQL Server 中执行此操作。
【问题讨论】:
【参考方案1】:使用 UNION ALL
SELECT UniqueID, key = key1, value = value1 from table
union all
SELECT UniqueID, key = key2, value = value2 from table
[编辑] : 下面是关于如何制作它的示例脚本Dynamic
假设:必须有一个键/值对
create table Table1
(
UniqueID int,
key1 int,
value1 varchar(10),
key2 int,
value2 varchar(10),
key3 int,
value3 varchar(10)
)
insert into Table1 select 1, 1, 'a', 2, 'b', 3, 'c'
insert into Table1 select 2, 5, 'e', 6, 'f', 7, 'g'
declare @sql nvarchar(max)
; with
col_key as
(
select key_col = c.name, rn = row_number() over (order by c.name)
from sys.columns c
where c.object_id = object_id('Table1')
and c.name like 'key%'
),
col_val as
(
select val_col = c.name, rn = row_number() over (order by c.name)
from sys.columns c
where c.object_id = object_id('Table1')
and c.name like 'value%'
)
select @sql = isnull(@sql + ' UNION ALL' + char(13), '')
+ 'SELECT UniqueID, [key] = ' + k.key_col + ', [value] = ' + v.val_col + ' '
+ 'FROM Table1'
from col_key k
inner join col_val v on k.rn = v.rn
print @sql
exec sp_executesql @sql
drop table Table1
【讨论】:
这非常快,感谢您的回复。有没有更动态的方法?dynamically
是什么意思?
我的意思是,如果我有一个包含 50 个这样的键值对的表,是否有 sql 可以生成我的结果集,而无需手动对列名进行硬编码。与此类似的东西 (***.com/questions/30792697/…).. 但它需要使用重复的键值对以上是关于SQL将带有UniqueID +多个键值对的表转换为行的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有内连接语句的 Sql 查询转换为带有 Where 语句的 sql 查询(语句中没有内连接)