Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将一组值替换为单个值和总和_Sql_Postgresql - Fatal编程技术网

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是的,这会更简单,但逻辑变化不会那么明显。我不知道您可以在分组方式中使用列号。案件陈述的重复让我感到紧张,也不是很紧张