将行数据转换为SQL Server中的列
发布时间:2021-03-08 09:13:25 所属栏目:MsSql教程 来源:网络整理
导读:今天,我的同事要求我将数据从垂直临时表转换为水平表.我的意思是将行转换为列.我用了PIVOT并解决了它.但是如果数据字段重复,我遇到了移动数据的麻烦. 以下是我正在处理的测试数据: CREATE TABLE STAGING ( ENTITYID INT,PROPERTYNAME VARCHAR(25),PROPERT
|
今天,我的同事要求我将数据从垂直临时表转换为水平表.我的意思是将行转换为列.我用了PIVOT并解决了它.但是如果数据字段重复,我遇到了移动数据的麻烦. 以下是我正在处理的测试数据: CREATE TABLE STAGING
(
ENTITYID INT,PROPERTYNAME VARCHAR(25),PROPERTYVALUE VARCHAR(25)
)
INSERT INTO STAGING VALUES (1,'NAME','DONNA')
INSERT INTO STAGING VALUES (1,'SPOUSE','HENRY')
INSERT INTO STAGING VALUES (1,'CHILD','JACK')
INSERT INTO STAGING VALUES (2,'KAYALA')
我使用PIVOT将行数据显示为列: SELECT * FROM (SELECT ENTITYID,PROPERTYNAME,PROPERTYVALUE FROM STAGING) AS T PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN (NAME,SPOUSE,CHILD)) AS T2 输出是: ENTITYID NAME SPOUSE CHILD 1 DONNA HENRY JACK 2 NULL NULL KAYALA 但他希望输出类似于: ENTITYID NAME SPOUSE CHILD CHILD 1 DONNA HENRY JACK KAYALA 底线是,登台表中可以有多个CHILD属性.我们需要考虑这一点,并将所有儿童移至列. 这可能吗? 解决方法您可以在属性名称中添加行号,以便您可以执行所需操作:SELECT * FROM ( SELECT ENTITYID,PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID,PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5)),PROPERTYVALUE FROM #STAGING ) AS T PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN (NAME1,SPOUSE1,CHILD1,CHILD2,CHILD3,CHILD4,CHILD5)) AS T2 我假设ENTITYID将子项绑定到父项,即同一个人的所有子项的ENTITYID为1,但您的示例显示Kayala为2. 这是一个演示:SQL Fiddle 如果你只想要CHILD字段的数字,你可以这样: PROPERTYNAME = CASE WHEN PROPERTYNAME LIKE '%CHILD%' THEN PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID,PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5)) ELSE PROPERTYNAME END 然后从IN()语句中的其他字段中删除该数字. 奖金问题 – 动态执行以上操作: DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + PROPERTYNAME
FROM (SELECT DISTINCT PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID,PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))
FROM STAGING )sub
ORDER BY CASE WHEN PROPERTYNAME LIKE '%NAME%' THEN 1
WHEN PROPERTYNAME LIKE '%SPOUSE%' THEN 2
WHEN PROPERTYNAME LIKE '%CHILD%' THEN 3
ELSE 4
END,RIGHT(PROPERTYNAME,1)
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(MAX)'),1,'')
SET @query = 'SELECT * FROM
(
SELECT ENTITYID,PROPERTYVALUE
FROM STAGING
) AS T
PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN ('+@cols+')) AS T2
'
EXEC(@query)
注意:订购仅适用于配偶1-9和子女1-9,您可以调整以适应,但无论如何它是任意的. (编辑:开发网_运城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql-server – 在SAN环境中对SQL索引进行碎片整理是否有任何
- sql server将datetime转换为另一个时区?
- sql-server – SQL表大小和查询性能
- sql-server – SQL Server 2005/2008的哪些备份恢复解决方案
- 绝对实惠:昂达豪华版865PEN主板669上市
- 补丁难以招架病毒 微软将推新安全策略
- sql-server-2008 – 参数嗅探与VARIABLES vs重新编译vs OPT
- 在SQL代理作业中运行C#代码
- P2P软件步入黄金发展期成04年互联网投资热点
- sql-server-2005 – 永久删除表时回收SQL Server 2005数据库

