今天,我的同事要求我将数据从垂直登台表转换为水平表。我的意思是将行转换为列。我使用了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, 'CHILD', '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()语句中的其他字段中删除该数字。
奖励问题-动态地执行上述操作: 我们不想假设人们只有一个配偶或2.3个孩子,因此我们会动态地进行全部操作:
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,1,'')
SET @query = '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 ('+@cols+')) AS T2
'
EXEC(@query)
注意:此顺序仅适用于1-9岁的配偶和1-9岁的孩子,您可以对其进行调整以适合自己,但无论如何都是任意的。
问题内容: 我有一个带有属性的文本,并设置为。 我正在尝试使用以下代码将属性字符串转换为Data对象: 但是,这将引发以下错误: 任何想法这个错误是什么意思或可能导致此错误?我正在使用最新的Xcode和iOS。谢谢。 问题答案: 您需要指定要将属性字符串转换为以下类型的文档数据: 更新Xcode 10.2•Swift 5或更高版本 对此进行扩展: 用法: 这将打印
问题内容: 更新: 现在可以在MySQL 8中通过JSON_TABLE函数:https ://dev.mysql.com/doc/refman/8.0/en/json-table- functions.html 我喜欢MySQL 5.7中的新JSON函数,但是遇到了一个试图将JSON中的值合并到普通表结构中的块。 掌握JSON,从中处理和提取数组等都很简单。始终使用JSON_EXTRACT。但是从
我试图找出点是否在闭合多边形中(在这个问题中:查找数据框中的点是否在多边形中,并为点指定多边形名称),但我意识到可能有另一种方法可以做到这一点: 我有这个数据框 我想把它转换成 对积分也这样做: 到 我从来没有使用过geopandas,在这里有点不知所措。 因此,我的问题是:如何从pandas数据帧到具有geopandas属性的数据帧? 感谢你的洞察力!
我在S3有一些遗留数据,我想使用Spark 2和Java API将它们转换成parquet格式。 我有所需的Avro模式(. avsc文件)及其使用Avro编译器生成的Java类,我想使用这些模式以Parque格式存储数据。输入数据不是任何标准格式,但我有一个库,可以将遗留文件中的每一行转换为Avro类。 是否可以将数据作为
问题内容: 我有一张像这样的桌子: 想要将其转换为: 在oracle中不使用此联合: 问题答案: 您可以尝试使用unpivot sqlfiddle:https ://dbfiddle.uk/ ? rdbms = oracle_11.2 & fiddle = b2105e1010b332ce5b702eba7bfa7f2d
问题内容: 我正在尝试将HTML表中存在的数据转换为JSON,以便可以在服务器端进行相应的处理。我可以序列化数据,但是结果充其量只能生成不直接链接的独特数据数组。像:这是我正在使用的形式: 序列化数据的脚本是: 经过数页StackOverFlow之后,我得到了serializeFormJSON(): 通过使用所有这些,我可以得到像这样的JSON: 我尝试了多种方法以名称-性别格式获取它们,但是每种