如何在不聚合数据的情况下透视SQL表

时间:2019-04-30 08:13:37

标签: sql-server pivot

我正在尝试旋转我的桌子:

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');

下面的图片是如何构造表格的。

enter image description here

收件人:

| 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))很遗憾,无法正常工作。

1 个答案:

答案 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