我有一个数据库表,内容如下:

Id Label GroupId DueDate Amount
1 (null) A 1/1/2023 100.00
2 (null) A 1/2/2023 101.00
3 L1 A 1/3/2023 102.00
4 L1 A 1/4/2023 103.00
5 (null) B 1/3/2023 104.00
6 L1 C 1/3/2023 105.00
7 (null) A 1/4/2023 106.00
8 (null) A 1/5/2023 107.00
9 L2 A 1/5/2023 108.00
10 L2 A 1/6/2023 109.00

我想用SELECT语句实现的是,在单行项目中报告具有相同值的‘Label’和‘group id’的记录,为金额提供一个sum(),为日期提供一个min().不应对标签列中具有空值的记录进行分组.

我的理想结果集应该如下所示:

Label GroupId DueDate Amount
(null) A 1/1/2023 100.00
(null) A 1/2/2023 101.00
L1 A 1/3/2023 205.00
(null) B 1/3/2023 104.00
L1 C 1/3/2023 105.00
(null) A 1/4/2023 106.00
(null) A 1/5/2023 107.00
L2 A 1/5/2023 217.00

如果有什么不同的话,那就是我的RDBMS是Postgres,所讨论的数据表大约有5亿行数据.

这可以作为使用CASE子句的单个SELECT语句吗?或者,是否有必要通过UNION执行多个 Select ,所有操作都采用如下方式:

select label, groupid, min(duedate), sum(amount) from my_table where label is not null
group by label, groupid
union all
select label, groupid, duedate, amount from my_table where label is null

如有任何建议,我们将不胜感激.

推荐答案

您的UNION ALL查询是一个很好的解决方案.如果出于某种原因您不想这样做,您可以使用表的ID for each 标签为空的行获取一个单独的"组".

select label, groupid, min(duedate), sum(amount)
from my_table
group by case when label is null then id end, label, groupid;

Sql相关问答推荐

SQL:创建查询以添加减少的总数

如何并行SELECT和RESET?

使用交叉应用透视表在SQL中转换分段时间段&

为什么Postgrs Planner会在输出部分中显示我在查询中不使用的列?'""

两个不同星期的销售额,不加成一行

基于是否具有某些数据的关联表覆盖SELECT语句中的列值

违反了完整性约束-值存在时找不到父键

group-by-clause具有特定列,而不是oracle的toad中的all

查询以从时间范围列表中查找唯一时间段

根据具有特定值的 ID 创建自定义组

用户定义的标量值函数是否仍然会阻止并行性?

计算 ID 满足条件的次数

基于变量的条件 WHERE 子句

如何在TSQL中编写此窗口查询

如何在 case 语句中使用聚合?

删除重复记录但保留最新的SQL查询

更新之前如何获得价值

Clob 问题 - 将 clob 列拆分为多行

在 MySql 数据库中的两个日期之间搜索

如何在一个存储过程中创建全局临时表,并在另一个存储过程中使用它