Как сводить таблицу SQL без совокупных данных - PullRequest
2 голосов
/ 30 апреля 2019

Я пытаюсь повернуть свою таблицу:

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.

Я думал, что могу использовать сводную таблицу для транспонирования своей таблицы с дополнительной логикой, чтобы разделить гекс на 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 Ответ

1 голос
/ 30 апреля 2019

Если у вас есть ограниченное и известное количество слоев (и не много), альтернативой повороту является условное агрегирование.Это означает использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...