我正在尝试旋转我的桌子:
CREATE TABLE articles (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
HCode varchar(2) ,
Style varchar(4) ,
Color varchar(3) ,
Layer smallint ,
HEX varchar(6)
);
带有一些样本值
INSERT INTO articles(HCode, Style, Color, Layer, HEX)
VALUES
('01', '0002', '001', '1', 'FFFFFF'),
('01', '0002', '002', '1', '000000'),
('01', '0002', '003', '1', '002A5A'),
('02', '0568', '586', '1', '11906C'),
('02', '0568', '586', '2', 'FFFFFF'),
('02', '0596', 'i91', '1', '009F48'),
('02', '0596', 'i91', '2', '245329'),
('02', '0640', 's23', '1', 'AEAB9C'),
('02', '0640', 's23', '2', '4C565C'),
('02', '0640', 's23', '3', 'BC111E');
下面的图片是如何构造表格的。
收件人:
| HCode | Style | Color | Layer | hex1 | hex2 | hex3 |
|-------+-------+-------+-------+------+------+------|
| 01 | 0002 | 001 | 1 |FFFFFF| NULL | NULL |
| 01 | 0002 | 002 | 1 |000000| NULL | NULL |
| 01 | 0002 | 003 | 1 |002A5A| NULL | NULL |
| 02 | 0568 | 586 | 2 |11906C|FFFFFF| NULL |
如果存在图层> 1,则文章有两种颜色。层数上限为3。
我认为我可以使用数据透视表将表与其他逻辑进行转置,以将十六进制分为三列。
WITH pivot_data AS
(
SELECT * FROM articles
)
SELECT * FROM pivot_data
PIVOT(
MAX(CONCAT(HCode,Style,Color)) FOR HEX IN ([hex1], [hex2], [hex3])
) AS PVT
我的问题是如何汇总3列? MAX(CONCAT(HCode,Style,Color))
很遗憾,无法正常工作。
答案 0 :(得分:1)
如果您的层数有限且已知(并且不多),则透视的另一种选择是条件聚合。这意味着将GROUP BY
与可与CASE
子句一起使用的聚合函数一起使用。
SELECT
A.HCode,
A.Style,
A.Color,
MAX(A.Layer) Layer,
MAX(CASE WHEN A.Layer = 1 THEN A.HEX END) Hex1,
MAX(CASE WHEN A.Layer = 2 THEN A.HEX END) Hex2,
MAX(CASE WHEN A.Layer = 3 THEN A.HEX END) Hex3
FROM
articles A
GROUP BY
A.HCode,
A.Style,
A.Color
结果:
HCode Style Color Layer Hex1 Hex2 Hex3
01 0002 001 1 FFFFFF NULL NULL
01 0002 002 1 000000 NULL NULL
01 0002 003 1 002A5A NULL NULL
02 0568 586 2 11906C FFFFFF NULL
02 0596 i91 2 009F48 245329 NULL
02 0640 s23 3 AEAB9C 4C565C BC111E