SQL Server: как транспонировать строки в столбцы - PullRequest
0 голосов
/ 12 октября 2018

В T-SQL я пытаюсь преобразовать значения некоторых строк в столбцы.
Исходная таблица:

Project | Machine | Value
-------------------------
A   X   100
A   Y   99
A   Z   98
A   W   97
B   X   97
B   Y   96
B   W   95
C   X   95
C   Z   94

Результат, который я хотел бы получить:

Project     MX  MY  MZ  MW
-----------------------------
A           100 99  98  97
B            97 96   0  95
C            95  0  94   0

Я создал тестовый код:

CREATE TABLE Company (project char(1), machine char(1), cost int)
GO

INSERT INTO Company 
VALUES ('A', 'X', 100), ('A', 'Y', 99), ('A', 'Z', 98),
       ('A', 'W', 97), ('B', 'X', 97), ('B', 'Y', 96),
       ('B', 'W', 95), ('C', 'X', 95), ('C', 'Z', 94);

Мой сводный запрос:

SELECT
    project, 'X', 'Y', 'Z', 'W'
FROM
    (SELECT 
         project, machine, cost 
     FROM 
         Company) p
PIVOT
    (MAX(cost)
        FOR machine IN ('X', 'Y', 'Z', 'W') AS  pvt

Я получаю эту ошибку:

Неверный синтаксис рядом с ''X' '

Мой сводный запрос неверен?

Заранее спасибо

1 Ответ

0 голосов
/ 12 октября 2018

Если у вас ограниченное количество машин, тогда я бы сделал условное агрегирование вместо PIVOT:

SELECT Project,
       MAX(CASE WHEN machine = 'X' THEN cost END) AS MX,
       MAX(CASE WHEN machine = 'Y' THEN cost END) AS MY,
       MAX(CASE WHEN machine = 'Z' THEN cost END) AS MZ,
       MAX(CASE WHEN machine = 'W' THEN cost END) AS MW
FROM Company c
GROUP BY Project;

Если вы хотите перейти с PIVOT, то я бы исправил синтаксическую ошибку с отсутствующимзакрывающая скобка:

SELECT * 
FROM (SELECT project, machine, cost 
      FROM Company 
     ) AS p PIVOT
     (MAX(cost)
      FOR machine IN ([X], [Y], [Z], [W]) 
     ) AS pvt;

Примечание:

  • Не используйте одинарные кавычки, так как вместо имени столбца используйте квадратные скобки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...