我有一个包含多个组件的键值对表。每种类型的组件都可以具有不同的属性(键),尽管每种类型的组件始终具有相同的属性。
例如:
----------------------------------- | Comp_ID | KeyField | ValueField | ----------------------------------- | A | Size | Big | | A | Weight | 10 | | A | Colour | Green | | B | Length | Short | | B | Density | 1.5 | | B | Colour | Yellow | | B | Radius | 3 | | C | Size | Small | | C | Weight | 20 | | C | Colour | Red | | D | Size | Small | | D | Weight | 20 | | D | Colour | Blue |
A,C和D都是相同类型的组件,而B则不同。
如何执行以下操作:
基于上面的示例,我希望有一个像这样的表:
------------------------------------- | Comp_ID | Size | Weight | Colour | ------------------------------------- | A | Big | 10 | Green | | C | Small | 20 | Red | | D | Small | 20 | Blue |
我正在查询一个oracle数据库,如果那很重要,但希望答案将是通用SQL-越简单越好:)
编辑:我意识到这不是存储数据的最佳方法,但是这超出了我的控制-这是GE的供应商解决方案,(显然)无法更改。我只需要查询数据。
您将要使用条件聚合。您也可以使用WHERE EXISTS来排除不包含“大小”的记录。
WHERE EXISTS
请注意,我已经稍微更改了字段名,您实际上不应该使用保留字作为字段名。
样本数据
CREATE TABLE #TestData (Comp_ID varchar(1), KeyField varchar(7), ValueField varchar(6)) INSERT INTO #TestData (Comp_ID, KeyField, ValueField) VALUES ('A','Size','Big') ,('A','Weight','10') ,('A','Colour','Green') ,('B','Length','Short') ,('B','Density','1.5') ,('B','Colour','Yellow') ,('B','Radius','3') ,('C','Size','Small') ,('C','Weight','20') ,('C','Colour','Red') ,('D','Size','Small') ,('D','Weight','20') ,('D','Colour','Blue')
询问
SELECT td.Comp_ID, Max(CASE WHEN td.KeyField = 'Size' THEN td.ValueField END) as Size, Max(CASE WHEN td.KeyField = 'Weight' THEN td.ValueField END) as Weight, Max(CASE WHEN td.KeyField = 'Colour' THEN td.ValueField END) as Colour FROM #TestData td WHERE EXISTS (SELECT * FROM #TestData td2 WHERE td2.KeyField = 'Size' AND td.Comp_ID = td2.Comp_ID) GROUP BY Comp_ID
输出
Comp_ID Size Weight Colour A Big 10 Green C Small 20 Red D Small 20 Blue
请注意,Comp_IDB不会出现,因为它没有’Size’条目。
Comp_ID