/ / SQL कैसे लिखें जो निम्नलिखित परिणाम दे सके? - sql, postgresql, pivot, crosstab

एसक्यूएल कैसे लिखें जो निम्नलिखित परिणाम दे सकता है? - एसक्यूएल, पोस्टग्रेस्क्ल, पिवट, क्रॉसस्टैब

मूल तालिका

+------------+---------+-------+-------------+--------+
| 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 के लिए 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