我需要为多列选择一个字符串值,同时还要对表中的数字列进行求和。
数据集
id | 人 | 费用 | 收入 | 记录 | 公开 |
---|---|---|---|---|---|
abc | 12 | 1 | 2 | 是的 | 没有 |
abc | 11 | 1 | 5 | 没有 | 是的 |
abc | 10 | 50 | 75 | 是的 | |
abc | 9 | 1000 | 20000 | 没有 | 没有 |
bcd | 1 | 20 | 25 | 没有 | 没有 |
cde | 5 | 0 | 0 | 没有 |
工作代码
select id, sum(expense) as sum_expense, sum(revenue) as sum(revenue)
from database
group by id
如何为字符串值列记录和公共添加某种类型的条件语句或子查询,以在存在(是、否或空)值时从数组中选择是,在存在(否或空)值时选择否,如果存在则选择空仅存在 null。
预期结果
id | 费用 | 收入 | 记录 | 公开 |
---|---|---|---|---|
abc | 1052 | 2082 | 是的 | 是的 |
bcd | 20 | 25 | 没有 | 没有 |
cde | 0 | 0 | 没有 |
您可以通过使用条件聚合根据每个组中存在的值为“记录”和“公共”列选择适当的字符串值来实现所需的结果。以下是您可以修改查询以实现此目的的方法:
SELECT
id,
SUM(expense) AS sum_expense,
SUM(revenue) AS sum_revenue,
CASE
WHEN COUNT(CASE WHEN records = 'Yes' THEN 1 END) > 0 THEN 'Yes'
WHEN COUNT(CASE WHEN records = 'No' THEN 1 END) > 0 THEN 'No'
ELSE NULL
END AS records,
CASE
WHEN COUNT(CASE WHEN public = 'Yes' THEN 1 END) > 0 THEN 'Yes'
WHEN COUNT(CASE WHEN public = 'No' THEN 1 END) > 0 THEN 'No'
ELSE NULL
END AS public
FROM
database
GROUP BY
id;
说明:
CASE
子句中的SELECT
语句用于条件逻辑,以确定“records”和“public”列的值。CASE
语句中:
COUNT(CASE WHEN ... THEN 1 END)
计算每组中“是”或“否”值的出现次数。NULL
。SUM(expense)
和SUM(revenue)
聚合函数用于像以前一样计算每个“id”组的费用和收入总和。此查询将为您提供预期结果,并根据指定的条件为“记录”和“公共”列提供适当的字符串值。根据您的实际架构,根据需要调整列名和表名。