Как мне повернуть таблицу с разными заголовками? - PullRequest
0 голосов
/ 09 мая 2019

У меня есть таблица 'TABLE_COUNT' следующим образом:

METRIC        COUNT 
SOURCE_A        10
MART_A        10
SOURCE_B        20
MART_B        20

Я использовал следующий скрипт:

select * from (  select METRIC, COUNT
FROM dbo.TABLE_COUNT
where METRIC in ('SOURCE_A','MART_A')) src
PIVOT
(AVG(COUNT) FOR METRIC IN ([SOURCE_A],[MART_A]) )piv
union all
select * from (  select METRIC, COUNT
FROM dbo.TABLE_COUNT
where METRIC in ('SOURCE_B','MART_B',)) src
PIVOT
(AVG(COUNT) FOR METRIC IN ([SOURCE_B],[MART_B]) )piv;

Вот результат, который я получаю:

SOURCE_A    MART_A 
10                10
null           null

Вот результат, который я получаю:

SOURCE_A    MART_A
10             10
null          null

Но я бы хотел спроецировать это так:

   SOURCE   MART
A   10       10
B   20       20

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Это может быть еще проще с запросом кросс-таблиц.

--Generate Sample data
CREATE TABLE #Sample(
    METRIC   varchar(50),     
    COUNT int);
INSERT INTO #Sample
VALUES
('SOURCE_A', 10),
('MART_A', 10),
('SOURCE_B', 20),
('MART_B', 20);
GO

--Solution
SELECT RIGHT( RTRIM( METRIC), 1),
    AVG( CASE WHEN METRIC LIKE 'SOURCE%' THEN [COUNT] END) AS SOURCE,
    AVG( CASE WHEN METRIC LIKE 'MART%' THEN [COUNT] END) AS MART
FROM #Sample
GROUP BY RIGHT( RTRIM( METRIC), 1);

GO
--Clean my database
DROP TABLE #Sample;

РЕДАКТИРОВАТЬ: Я думаю, это также может быть сделано с помощью сводной.

SELECT * 
FROM (  SELECT SUBSTRING( METRIC, 0, CHARINDEX( '_', METRIC)) AS MetricType, 
            RIGHT( RTRIM( METRIC), 1) AS MetricGroup, 
            COUNT
        FROM #Sample) src
PIVOT (AVG(COUNT) FOR MetricType IN ([SOURCE],[MART]) )piv;
0 голосов
/ 09 мая 2019

Вы можете создать псевдоним полей в своем первом операторе объединения.

select SOURCE = SOURCE_A, MART = MART_A from (  select METRIC, COUNT
FROM dbo.TABLE_COUNT
where METRIC in ('SOURCE_A','MART_A')) src
PIVOT
(AVG(COUNT) FOR METRIC IN ([SOURCE_A],[MART_A]) )piv
union all
select * from (  select METRIC, COUNT
FROM dbo.TABLE_COUNT
where METRIC in ('SOURCE_B','MART_B',)) src
PIVOT
(AVG(COUNT) FOR METRIC IN ([SOURCE_B],[MART_B]) )piv;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...