如何按两列分组以仅显示一行?

时间:2014-02-19 17:24:29

标签: sql postgresql group-by aggregate-functions

以下是我对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
  • 现在,如果您看到我的上述输出,123会在col1col2多次出现。我想将它们分组在一行中,以便我将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任何小提琴的例子都很棒。

4 个答案:

答案 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 byorder 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