SQL 从一行中的单个 table 查询到 return 多个键值对
SQL Query to return multiple key value pairs from a single table in one row
我有多个组件的单个 table 键值对。每种类型的组件都可以有不同的属性(键),尽管每种类型总是有相同的属性。
例如:
-----------------------------------
| 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不同。
我怎样才能做到以下几点:
- Select 仅具有特定属性(键)的组件。例如:仅具有尺寸键的组件。
- 每个组件 ID 显示一行。
根据上面的例子,我希望 table 像这样:
-------------------------------------
| Comp_ID | Size | Weight | Colour |
-------------------------------------
| A | Big | 10 | Green |
| C | Small | 20 | Red |
| D | Small | 20 | Blue |
如果这很重要,我正在查询 oracle 数据库,但希望答案是通用的 SQL - 越简单越好:)
编辑:我意识到这不是存储数据的最佳方式,但这超出了我的控制范围 - 这是 GE 的供应商解决方案,(显然)无法更改。我只是需要查询数据。
您可以使用条件聚合来做到这一点
SELECT Comp_ID,
Max(CASE WHEN KEY = 'Size' THEN value END) as Size,
Max(CASE WHEN KEY = 'Weight' THEN value END) as Weight,
Max(CASE WHEN KEY = 'Colour' THEN value END) as Colour
FROM yourtable
GROUP BY Comp_ID
如果 Comp_ID
同一键可以有多个记录,那么您需要根据您的要求替换聚合 (Max
)
这不是存储数据的正确方式,请考虑更改您的 table 结构。每个 Key
最好有单独的 table。
您需要使用条件聚合。您还可以使用 WHERE EXISTS
来排除不包含 'Size' 的记录。
请注意,我稍微更改了字段名称,您真的不应该使用保留字作为字段名称。
示例数据
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_ID
B 没有出现,因为它没有 'Size' 条目。
我有多个组件的单个 table 键值对。每种类型的组件都可以有不同的属性(键),尽管每种类型总是有相同的属性。
例如:
-----------------------------------
| 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不同。
我怎样才能做到以下几点:
- Select 仅具有特定属性(键)的组件。例如:仅具有尺寸键的组件。
- 每个组件 ID 显示一行。
根据上面的例子,我希望 table 像这样:
-------------------------------------
| Comp_ID | Size | Weight | Colour |
-------------------------------------
| A | Big | 10 | Green |
| C | Small | 20 | Red |
| D | Small | 20 | Blue |
如果这很重要,我正在查询 oracle 数据库,但希望答案是通用的 SQL - 越简单越好:)
编辑:我意识到这不是存储数据的最佳方式,但这超出了我的控制范围 - 这是 GE 的供应商解决方案,(显然)无法更改。我只是需要查询数据。
您可以使用条件聚合来做到这一点
SELECT Comp_ID,
Max(CASE WHEN KEY = 'Size' THEN value END) as Size,
Max(CASE WHEN KEY = 'Weight' THEN value END) as Weight,
Max(CASE WHEN KEY = 'Colour' THEN value END) as Colour
FROM yourtable
GROUP BY Comp_ID
如果 Comp_ID
同一键可以有多个记录,那么您需要根据您的要求替换聚合 (Max
)
这不是存储数据的正确方式,请考虑更改您的 table 结构。每个 Key
最好有单独的 table。
您需要使用条件聚合。您还可以使用 WHERE EXISTS
来排除不包含 'Size' 的记录。
请注意,我稍微更改了字段名称,您真的不应该使用保留字作为字段名称。
示例数据
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_ID
B 没有出现,因为它没有 'Size' 条目。