问题如下

WITH notes AS (
    SELECT 891090 Order_ID, False customer_billing,  false commander, true agent 
    UNION ALL
    SELECT 891091, false, true, true 
    UNION ALL
    SELECT 891091, true, false, false)

SELECT
  n.order_id,
  string_Agg(distinct CASE
    WHEN n.customer_billing = TRUE THEN 'AR (Customer Billing)'
    WHEN n.commander = TRUE THEN 'AP (Commander)'
    WHEN n.agent = TRUE THEN 'AP (Agent)'
    ELSE NULL
  END,', ') AS finance
FROM notes n
WHERE
 n.order_id = 891091 AND (n.customer_billing = TRUE or n.commander = TRUE or n.agent = TRUE)
 GROUP BY ORDER_ID

如您所见,有两条订单id为891091的记录.

  • 第一条891091记录将commanderagent设置为真
  • 第二条891091记录有customer_billing条为真

由于使用switch 盒,它只考虑第一个真值,返回commander,不考虑agent.

因此,输出变为

order_id    finance
891091  AP (Commander), AR (Customer Billing)

dbfiddle.uk Example

我需要考虑记录中的所有真值,以便输出

order_id    finance
    891091  AP (Commander), AP (Agent), AR (Customer Billing)

我最初的 idea 是使用if语句而不是case语句可以解决这个问题.我不知道如何在string_agg函数中实现这一点

如何做到这一点?

编辑1:

下面给出的答案几乎可以.问题是distinct个逗号不是分开的

这是最新的小提琴

推荐答案

您可以考虑将case个拆分为单独的,并使用数组来收集它们.然后可以使用array_to_string设置以下格式:

WITH notes AS (
  SELECT 891090 Order_ID, False customer_billing,  false commander, true agent UNION ALL
  SELECT 891091, false, true, true UNION ALL
  SELECT 891091, true, true, false),
tmp as (
SELECT
  n.order_id id,
      array_agg(
        ARRAY[
          CASE WHEN n.customer_billing = TRUE THEN 'AR (Customer Billing)' END,
          CASE WHEN n.commander = TRUE THEN 'AP (Commander)' END,
          CASE WHEN n.agent = TRUE THEN 'AP (Agent)' END
        ]) AS finance_array
FROM notes n
WHERE
 n.order_id = 891091 AND (n.customer_billing = TRUE or n.commander = TRUE or n.agent = TRUE)
 GROUP BY ORDER_ID )
 select id, array_to_string(array(select distinct e from unnest(finance_array) as a(e)), ', ')
 from tmp;

这是db_fiddle美元.

Sql相关问答推荐

SQL是否可以计算每年的所有日期变化?

用于动态查询情况的存储过程常识模式

找到最新的连线

根据开始日期和结束日期的差异计算每天的计费

SQL按日期分组字段和如果日期匹配则求和

SQL到Snowflake-转换嵌套的SELECT(值

用于SQL协助的XQUERY()

统计PostgreSQL中前10个最大大小表的行数

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

将 json 列键映射到第二个表中的匹配列值

如何在 SQL Server 中解决这个复杂的窗口查询?

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

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

SQL Server - 复杂场景 - 比较状态并填充值到后续行

正则表达式:停在第一个匹配的其中一个字符位置上

T-SQL - 返回每条记录的最近雇佣日期

连续几天购买的客户

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

SQL中所有先前日期的累计总和

遍历数据,计算每个月最后三天的总和