求和值和条件语句,是或否字符串值的子查询

问题描述 投票:0回答:1

我需要为多列选择一个字符串值,同时还要对表中的数字列进行求和。

数据集

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 没有
sql subquery amazon-redshift
1个回答
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”组的费用和收入总和。

此查询将为您提供预期结果,并根据指定的条件为“记录”和“公共”列提供适当的字符串值。根据您的实际架构,根据需要调整列名和表名。

© www.soinside.com 2019 - 2024. All rights reserved.