Reputation: 19612
Below is my query which I am running against Postgres database.
SELECT ad.col1
,ad.col2
,md.col3
,ad.col4
,mcd.col5
,AVG(mcd.col5 / md.col3) AS dc
,AVG(md.col3 / ad.col4) AS cb
FROM tableCount AS md
INNER JOIN tablePop AS ad ON ad.col1 = md.col1
AND ad.col2 = md.col2
INNER JOIN tableData AS mcd ON mcd.col1 = md.col1
AND mcd.col2 = md.col2
WHERE md.col2 = 23
AND md.col1 = '1'
GROUP BY ad.col1
,ad.col2
,md.col3
,ad.col4
,mcd.col5
ORDER BY md.col3 DESC limit 30
GROUP BY ad.col1
,ad.col2;
And below is the output I am getting back on the console with the use of above query-
col1 col2 col3 col4 col5 dc cb
1 23 48108 224123 479 0.00000000000000000000 0.00000000000000000000
1 23 48108 224123 89 0.00000000000000000000 0.00000000000000000000
1 23 48108 224123 142 0.00000000000000000000 0.00000000000000000000
1 23 48108 224123 1649 0.00000000000000000000 0.00000000000000000000
1 23 48108 224123 14 0.00000000000000000000 0.00000000000000000000
1 23 48108 224123 203 0.00000000000000000000 0.00000000000000000000
1 23 48108 224123 52 0.00000000000000000000 0.00000000000000000000
1 23 48108 224123 62 0.00000000000000000000 0.00000000000000000000
1 23 48108 224123 65 0.00000000000000000000 0.00000000000000000000
1 23 48108 224123 33 0.00000000000000000000 0.00000000000000000000
1
and 23
is coming multiple times in col1
and col2
. I would like to group them in one single row such that I would SUM col3, col4, col5, dc and cb
.So the output I would like to see it is -
col1 col2 col3 col4 col5 dc cb
1 23 48108 2241230 278 0.00000000000000000000 0.00000000000000000000
Is this possible to do in SQL?
P.S Any Fiddle example would be great.
Upvotes: 1
Views: 112
Reputation: 20804
You can turn your query to a derived table by making it a subquery with an alias. Then you can select from it.
select col1, col2, col3, col4, col5, dc, sum(col3 + col4 + col5 + dc + cb) thesum
from (query from your question goes here) temp
group by col1, col2, col3, col4, col5, dc
Upvotes: 0
Reputation: 34774
You can SUM()
or take the MAX()
, really it's only col5
in your sample that is resulting in multiple rows, GROUP BY
any non-aggregate field, and pick the appropriate aggregate for any other field:
SELECT ad.col1
,ad.col2
,MAX(md.col3)
,MAX(ad.col4)
,AVG(mcd.col5)
,AVG(mcd.col5 / md.col3) AS dc
,AVG(md.col3 / ad.col4) AS cb
FROM tableCount AS md
INNER JOIN tablePop AS ad ON ad.col1 = md.col1
AND ad.col2 = md.col2
INNER JOIN tableData AS mcd ON mcd.col1 = md.col1
AND mcd.col2 = md.col2
WHERE md.col2 = 23
AND md.col1 = '1'
GROUP BY ad.col1
,ad.col2
ORDER BY md.col3 DESC limit 30
Upvotes: 1
Reputation: 13725
Maybe like this:
SELECT ad.col1
,ad.col2
,min(md.col3)
,min(ad.col4)
,min(mcd.col5)
,AVG(mcd.col5 / md.col3) AS dc
,AVG(md.col3 / ad.col4) AS cb
FROM tableCount AS md
INNER JOIN tablePop AS ad ON ad.col1 = md.col1
AND ad.col2 = md.col2
INNER JOIN tableData AS mcd ON mcd.col1 = md.col1
AND mcd.col2 = md.col2
WHERE md.col2 = 23
AND md.col1 = '1'
GROUP BY ad.col1
,ad.col2
ORDER BY min(md.col3)
Upvotes: 0
Reputation: 1269793
You want to remove col5
from the group by
:
SELECT ad.col1
,ad.col2
,md.col3
,ad.col4
,sum(mcd.col5) as col5
,AVG(mcd.col5 / md.col3) AS dc
,AVG(md.col3 / ad.col4) AS cb
FROM tableCount AS md
INNER JOIN tablePop AS ad ON ad.col1 = md.col1
AND ad.col2 = md.col2
INNER JOIN tableData AS mcd ON mcd.col1 = md.col1
AND mcd.col2 = md.col2
WHERE md.col2 = 23
AND md.col1 = '1'
GROUP BY ad.col1
,ad.col2
,md.col3
,ad.col4
ORDER BY md.col3 DESC limit 30
I assume the last group by
and order by
are there accidentally.
Upvotes: 1