2016-09-16 28 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個額外的列。 –

相關問題