Sql 将一组值替换为单个值和总和
我的报告如下:Sql 将一组值替换为单个值和总和,sql,postgresql,Sql,Postgresql,我的报告如下: 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为true时,我都要替换group2中的值,并对超出的金额求和,结果是: gr
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为true时,我都要替换group2中的值,并对超出的金额求和,结果是:
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仍能正常工作。事实证明,在Postgresql中,您可以按别名列进行分组,如中所述: 在严格的SQL中,GROUPBY只能按源表的列分组 但是PostgreSQL扩展了这一点,允许GROUPBY对GROUPBY列进行分组 在选择列表中。按值表达式分组而不是按简单表达式分组 也允许使用列名 这表明,在行动中:
SELECT
group1,
CASE WHEN is_bar THEN 'bar' ELSE group2 END group2_grouped,
SUM(AMOUNT)
FROM foo
GROUP BY group1, group2_grouped
当您尝试将CASE语句的别名与列名相同时,会出现问题,因为Postgresql将按原始列而不是别名分组。这在以下章节中提到:
如果出现歧义,按名称分组将被解释为
输入列名而不是输出列名
不确定为什么需要子查询-我想您可以选择group1,CASE。。。结束,在顶层使用foo中的summantium,并使用列号来分组和排序。我会将其设为1,2的分组。@Patrick是的,这会更简单,但逻辑变化不会那么明显。我不知道您可以在分组方式中使用列号。案件陈述的重复让我感到紧张,也不是很紧张