2015-08-04 3 views
-2

У меня есть следующая таблица со следующими столбцами.Как создать таблицу Matrix на SQL из другой таблицы

------------------------------------- 
    Column1 | Column2 | TotalCount 
    -------------------------------------- 
     1   1   40 
     1   2   50 
     2   1   10 
     2   2   60 

Кроме того, у меня есть еще один стол, который связан с COLUMN1 где 1 X и 2 является Y и то же самое для COLUMN2 где 1 является и 2 B

Я пытаюсь придумать SQL, который в основном дает мне некоторое представление, подобное ...

 -------------------- 
     ColumnName | A | B 
     -------------------- 
      X  40 50 
      Y  10 60 

Любая идея, как я могу это достичь? Я пытаюсь свернуть данные без везения.

Спасибо!

ответ

1

Полный рабочий пример:

DECLARE @DataSource TABLE 
(
    [Column1] TINYINT 
    ,[Column2] TINYINT 
    ,[TotalCount] TINYINT 
); 

INSERT INTO @DataSource ([Column1], [Column2], [TotalCount]) 
VALUES (1, 1, 40) 
     ,(1, 2, 50) 
     ,(2, 1, 10) 
     ,(2, 2, 60); 

SELECT * 
FROM 
(
    SELECT IIF([Column1] = 1, 'X', 'Y') AS [ColumnName] 
      ,IIF([Column2] = 1, 'A', 'B') AS [Column2] 
      ,[TotalCount] 
    FROM @DataSource 
) DS 
PIVOT 
(
    MAX([TotalCount]) FOR [Column2] IN ([A], [B]) 
) PVT; 

enter image description here

+0

Вау ... это выглядит потрясающе! Что, если количество значений, которое у вас есть в столбцах 1 и столбце2, неизвестно до запуска запроса? Можно ли сделать что-то подобное? – user3587624

+0

@ user3587624 Для того, чтобы сделать 'PIVOT' вам нужно знать значения' [Column2] '-' [Column1] ', не важно, поскольку мы делаем группировку по нему (это может быть любое значение). – gotqn

+0

Значит, это значит, что я могу иметь 5000 элементов в столбцах 1 и столбце2, которые мне не нужны, чтобы знать их значения? – user3587624

1

Использование условной агрегации:

WITH tbl AS(
    SELECT * FROM (VALUES 
     (1, 1, 40), (1, 2, 50), 
     (2, 1, 10), (2, 2, 60) 
    )t(Column1, Column2, TotalCount) 
) 
SELECT 
    ColumnName = CASE WHEN Column1 = 1 THEN 'X' ELSE 'Y' END, 
    A = MAX(CASE WHEN Column2 = 1 THEN TotalCount END), 
    B = MAX(CASE WHEN Column2 = 2 THEN TotalCount END) 
FROM tbl 
GROUP BY Column1 

РЕЗУЛЬТАТ:

ColumnName A   B 
---------- ----------- ----------- 
X   40   50 
Y   10   60 
Смежные вопросы