sql中列表表到矩阵表的转换
我在SQL中有下表:sql中列表表到矩阵表的转换,sql,oracle,Sql,Oracle,我在SQL中有下表: Name | Date | Property | Value ------------------------------------ Name1 | Date1 | PropertyA | Value11A Name1 | Date1 | PropertyB | Value11B Name1 | Date2 | PropertyA | Value12A Name1 | Date2 | PropertyB | Value12B Name2 | Date1 | Prop
Name | Date | Property | Value
------------------------------------
Name1 | Date1 | PropertyA | Value11A
Name1 | Date1 | PropertyB | Value11B
Name1 | Date2 | PropertyA | Value12A
Name1 | Date2 | PropertyB | Value12B
Name2 | Date1 | PropertyA | Value21A
Name2 | Date1 | PropertyB | Value21B
Name2 | Date2 | PropertyA | Value22A
Name2 | Date2 | PropertyB | Value22B
------------------------------------
并希望有以下输出:
Name | Date | PropertyAValue | PropertyBValue
-----------------------------------------------
Name1 | Date1 | Value11A | Value11B
Name1 | Date2 | Value12A | Value12B
Name2 | Date1 | Value21A | Value21B
Name2 | Date2 | Value22A | Value22B
我构建了一些可以与许多select/where语句一起工作的东西。但是一旦你有了10个属性,查询就会变得非常繁重。你能帮我做点更有效率的事吗
编辑:我在Oracle上。我也查看了pivot函数,但它只适用于聚合值,但我不聚合任何内容,只对表进行重新格式化并将一个值作为列。
pivot
可在SQL Server中使用,以实现您想要的:
SELECT Name, Date, [PropertyA] AS PropertyAValue , [PropertyB] AS PropertyBValue
FROM
(SELECT * FROM your_table) p
PIVOT
(
MAX(Value)
FOR Property IN ([PropertyA],[PropertyB])
) AS pvt
这是你的密码
这是与上述查询相当的Oracle查询:
SELECT *
FROM (SELECT Name, Date1, Property, Value
FROM your_table)
PIVOT (MAX(Value) FOR (Property) IN ('PropertyA' AS PropertyA, 'PropertyB' AS PropertyB))
ORDER BY Name, Date1;
这是在Use
PIVOT
,…请添加您正在使用的DB服务器的标记…Oracle,MySQL…?欢迎,您可以尝试在Oracle中使用PIVOT
。它仅在聚合值时起作用,但我需要通过重新构造表来分别使用所有值。因为列和行组合有唯一的值,使用MAX
基本上会导致为行-列组合显示相同的唯一值。在这种特殊情况下,PIVOT
会导致数据重构,而不会产生任何真正的聚合,即使我们使用了MAX
,但这只是为了符合语法。