2016-09-16 27 views
1

原始表如何编写可以给出以下结果的SQL?

+------------+---------+-------+-------------+--------+ 
| CampaignID | Medium | Month | Impressions | Clicks | 
+------------+---------+-------+-------------+--------+ 
| A   | Google | Jan |   15 |  2 | 
| B   | Google | Jan |   12 |  1 | 
| A   | YouTube | Jan |   11 |  2 | 
| B   | YouTube | Jan |   12 |  4 | 
| A   | Google | Feb |   15 |  3 | 
| B   | Google | Feb |   13 |  4 | 
| A   | YouTube | Feb |   12 |  2 | 
| B   | YouTube | Feb |   21 |  5 | 
+------------+---------+-------+-------------+--------+ 

预期结果

+-----------+--------------------+---------------+---------------------+----------------+ 
| CampainID | Google Impressions | Google Clicks | YouTube Impressions | YouTube Clicks | 
+-----------+--------------------+---------------+---------------------+----------------+ 
| A   |     30 |    5 |     23 |    4 | 
| B   |     25 |    4 |     3 |    39 | 
+-----------+--------------------+---------------+---------------------+----------------+ 

在运行时生成的值的在介质中需要的数量。这意味着查询结果中的列数是动态依赖于数据。 PostgreSQL中最优雅的解决方案是什么?

回答

1

可以查询这样:

WITH Src AS 
(
SELECT * FROM (VALUES 
    ('A', 'Google' , 'Jan', 15, 2), 
    ('B', 'Google' , 'Jan', 12, 1), 
    ('A', 'YouTube', 'Jan', 11, 2), 
    ('B', 'YouTube', 'Jan', 12, 4), 
    ('A', 'Google' , 'Feb', 15, 3), 
    ('B', 'Google' , 'Feb', 13, 4), 
    ('A', 'YouTube', 'Feb', 12, 2), 
    ('B', 'YouTube', 'Feb', 21, 5)) T(CampaignID, Medium, Month, Impressions, Clicks) 
) --End sample data 

SELECT CampaignID, 
    SUM(CASE WHEN Medium='Google' THEN Impressions ELSE 0 END) "Google Impessions", 
    SUM(CASE WHEN Medium='Google' THEN Clicks ELSE 0 END) "Google Clicks", 
    SUM(CASE WHEN Medium='YouTube' THEN Impressions ELSE 0 END) "YouTube Impessions", 
    SUM(CASE WHEN Medium='YouTube' THEN Clicks ELSE 0 END) "YouTube Clicks" 
FROM Src 
GROUP BY CampaignID 
+0

但我不知道有多少价值在那里为中等。明天我可以有另一个名为“Facebook”的媒体,但我现在开发的解决方案必须足够好才能满足这种情况。即新的结果应该有2个额外的列。 –

相关问题