Col*_*ock 0 sql oracle plsql pivot oracle11g
给定下面的表格,我如何构建一个SQL查询,其中包含"items"表中所有项目的列表,以及"colors"表中每种颜色的列,对于列出的每个项目,它指示的是什么颜色item与...有关系.
如果不清楚,请告诉我哪些其他信息有助于澄清.表信息和所需的SQL结果如下:
物品表:
id | item_name
1 | 'item 1'
2 | 'item 2'
3 | 'item 3'
Run Code Online (Sandbox Code Playgroud)
颜色表:
id | color_name
1 | 'red'
2 | 'blue'
3 | 'green'
Run Code Online (Sandbox Code Playgroud)
item_color表:
item_id | color_id
1 | 1
1 | 3
2 | 2
2 | 3
3 | 2
Run Code Online (Sandbox Code Playgroud)
期望的SQL查询结果:
item_name | red | blue | green
'item 1' | 1 | null | 1
'item 2' | null| 1 | 1
'item 3' | null| 1 | null
Run Code Online (Sandbox Code Playgroud)
谢谢,科林
使用:
SELECT item_name,
MAX(red) 'red',
MAX(blue) 'blue',
MAX(green) 'green'
FROM (SELECT t.item_name,
CASE
WHEN c.color_name = 'red' THEN
1
ELSE
NULL
END 'red',
CASE
WHEN c.color_name = 'blue' THEN
1
ELSE
NULL
END 'blue',
CASE
WHEN c.color_name = 'green' THEN
1
ELSE
NULL
END 'green'
FROM ITEMS t
JOIN ITEM_COLOR ic ON ic.item_id = t.item_id
JOIN COLORS c ON c.id = ic.color_id)
GROUP BY item_name
Run Code Online (Sandbox Code Playgroud)
如果您想要与项目关联的红色/蓝色/绿色的总数,请将MAX更改为COUNT.
使用子查询因子替代:
WITH icolors AS (
SELECT t.item_name,
CASE
WHEN c.color_name = 'red' THEN
1
ELSE
NULL
END 'red',
CASE
WHEN c.color_name = 'blue' THEN
1
ELSE
NULL
END 'blue',
CASE
WHEN c.color_name = 'green' THEN
1
ELSE
NULL
END 'green'
FROM ITEMS t
JOIN ITEM_COLOR ic ON ic.item_id = t.item_id
JOIN COLORS c ON c.id = ic.color_id)
SELECT t.item_name,
MAX(t.red) 'red',
MAX(t.blue) 'blue',
MAX(t.green) 'green'
FROM icolors t
GROUP BY t.item_name
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1985 次 |
| 最近记录: |