我有一个表“ 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
答案 0 :(得分:0)
您可以在第一个并集语句中为字段加上别名。
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;
答案 1 :(得分:0)
使用交叉表查询可能更简单。
--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;