以下是我对Postgres数据库运行的查询。
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;
以下是我使用上述查询 -
返回控制台的输出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
和23
会在col1
和col2
多次出现。我想将它们分组在一行中,以便我将SUM col3, col4, col5, dc and cb
。所以我希望看到的输出是 -
col1 col2 col3 col4 col5 dc cb
1 23 48108 2241230 278 0.00000000000000000000 0.00000000000000000000
这可以在SQL中做吗?
P.S任何小提琴的例子都很棒。
答案 0 :(得分:1)
您想要从col5
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
我认为最后group by
和order by
是偶然的。
答案 1 :(得分:1)
您可以SUM()
或接受MAX()
,实际上只有col5
样本中的GROUP BY
导致多行,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
任何非聚合字段,并选择任何其他字段的适当聚合:
{{1}}
答案 2 :(得分:0)
也许是这样的:
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)
答案 3 :(得分:0)
您可以将查询变为带有别名的子查询,从而将查询转换为派生表。然后你可以从中选择。
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