Reputation: 2457
I have query results as follow:
SELECT ... ON CIA_factbook_dataset.my_name = World_Bank_dataset.my_name ...
+----------------+------+-------------+-----------------+---------+--------+
| my_name | Year | CIA_name | World_Bank_name | CIA_GDP | WB_GDP |
+----------------+------+-------------+-----------------+---------+--------+
| United Kingdom | 2010 | UK | United Kingdom | 2850 | 2800 |
| United Kingdom | 2010 | UK | Channel Islands | 2850 | 11 |
| Cyprus | 2010 | CYPRUS TURK | CYPRUS TURK | 22 | 22 |
| Cyprus | 2010 | CYPRUS TURK | CYPRUS GRK | 22 | 33 |
| Cyprus | 2010 | CYPRUS GRK | CYPRUS TURK | 33 | 22 |
| Cyprus | 2010 | CYPRUS GRK | CYPRUS GRK | 33 | 33 |
+----------------+------+-------------+-----------------+---------+--------+
I need to calculate the sum of the sub-country data, But if I'm using just GROUP BY my_name,year
, it calculates the sum of the same number few times.
The final result should be:
+----------------+------+---------+--------+
| my_name | Year | CIA_GDP | WB_GDP |
+----------------+------+---------+--------+
| United Kingdom | 2010 | 2850 | 2811 |
| Cyprus | 2010 | 55 | 55 |
+----------------+------+---------+--------+
Instead of:
+----------------+------+---------+--------+
| my_name | Year | CIA_GDP | WB_GDP |
+----------------+------+---------+--------+
| United Kingdom | 2010 | 5700 | 2811 |
| Cyprus | 2010 | 110 | 110 |
+----------------+------+---------+--------+
How to achieve that?
Any better way than to use SUM(distinct CIA_GDP),SUM(distinct WB_GDP)
?
(Theoretically, the GDP of turkish cyprus and greek cyprus might be the same)
Upvotes: 1
Views: 46
Reputation: 3006
For this I'm assuming my_name
, Year
is unique in both tables.
SELECT t1.my_name, t1.YEAR, SUM_CIA_GDP, SUM_WB_GDP
FROM (
SELECT DISTINCT my_name, YEAR, SUM(CIA_GDP) AS SUM_CIA_GDP
FROM t
GROUP BY my_name, YEAR, WB_GDP
) t1
JOIN (
SELECT DISTINCT my_name, YEAR, SUM(WB_GDP) AS SUM_WB_GDP
FROM t
GROUP BY my_name, YEAR, CIA_GDP
) t2
ON t1.my_name = t2.my_name
AND t1.YEAR = t2.YEAR
| my_name | YEAR | SUM_CIA_GDP | SUM_WB_GDP |
|----------------|------|-------------|------------|
| Cyprus | 2010 | 55 | 55 |
| United Kingdom | 2010 | 2850 | 2811 |
Upvotes: 1
Reputation: 5894
MySQL 5.6 Schema Setup:
CREATE TABLE t
(`my_name` varchar(14), `Year` int, `CIA_name` varchar(11), `World_Bank_name` varchar(15), `CIA_GDP` int, `WB_GDP` int)
;
INSERT INTO t
(`my_name`, `Year`, `CIA_name`, `World_Bank_name`, `CIA_GDP`, `WB_GDP`)
VALUES
('United Kingdom', 2010, 'UK', 'United Kingdom', 2850, 2800),
('United Kingdom', 2010, 'UK', 'Channel Islands', 2850, 11),
('Cyprus', 2010, 'CYPRUS TURK', 'CYPRUS TURK', 22, 22),
('Cyprus', 2010, 'CYPRUS TURK', 'CYPRUS GRK', 22, 33),
('Cyprus', 2010, 'CYPRUS GRK', 'CYPRUS TURK', 33, 22),
('Cyprus', 2010, 'CYPRUS GRK', 'CYPRUS GRK', 33, 33)
;
Query 1:
SELECT my_name, Year, SUM(CIA_GDP), WB_GDP
FROM (
SELECT my_name, Year, CIA_GDP, SUM(WB_GDP) WB_GDP
FROM t
GROUP BY my_name, Year, CIA_GDP
) t1
GROUP BY my_name, Year, WB_GDP
| my_name | Year | SUM(CIA_GDP) | WB_GDP |
|----------------|------|--------------|--------|
| Cyprus | 2010 | 55 | 55 |
| United Kingdom | 2010 | 2850 | 2811 |
Upvotes: 2