我已经a table如下:

id  group1  group2  is_bar  amount
1   a       bar1    true    100
2   a       bar2    true    200
3   a       baz     false   150
4   a       baz     false   250
5   b       bar1    true    50

每次is_bar为真时,我都要替换group2中的值并对amount求和,结果是:
group1  group2  amount
a       bar     300
a       baz     400
b       bar     50

我现在使用一个子查询,然后按表中的每一列进行分组!但这对我来说有点怪:
SELECT group1, group2, sum(amount) FROM
(
  SELECT group1,
  CASE WHEN is_bar THEN 'bar' ELSE group2 END as group2,
  amount
  FROM foo
) new_foo
GROUP BY group1, group2
ORDER BY group1, group2;

有聪明人解决这个问题吗?

最佳答案

我认为这应该管用:

SELECT
    group1
    , CASE WHEN is_bar THEN 'bar' ELSE group2 END as group2
    , SUM(AMOUNT)
FROM foo
GROUP BY group1, CASE WHEN is_bar THEN 'bar' ELSE group2 END

正如@Patrick在评论中提到的,您可以用GROUP BY替换GROUP BY 1, 2中非常长的条件。
这将自动引用SELECT语句中的第1列和第2列(第一列和第二列),查询将具有相同的输出。但是,如果您将不同的列添加为第一列,则必须通过更改或添加表示第一列的数字/条件来确保GROUP BY仍按预期工作。

10-08 20:19