将多行 SQL 响应合并为一行并重命名值

Combining multiple lines of SQL response into a single line and renaming values

我有一个查询,例如...

SELECT a.order_number, b.state
from tableone a
tabletwo b
WHERE
1=1
AND a.id = b.id
AND a.order_number = '12345';

这输出:

order_number    state
12345             CA
12345             AZ
12345             NY

我正在寻找而不是将此 return 连接成一行,这样我就可以将此结果保留在一行中。

order_number       state
12345                 CA,AZ,NY

所以我构建了这个:

SELECT
a.order_number, 
LISTAGG(b.state, ',') WITHIN GROUP (ORDER BY a.order_number) AS states
from tableone a
tabletwo b
WHERE
1=1
AND a.id = b.id
AND a.order_number = '12345'
GROUP BY a.order_number;    

现在 - 我的问题是 - 如何为这些状态分配值?只有 3 个 - CA、AZ 和 NY,其中 CA = 1、AZ = 2 和 NY = 3。我必须执行此逻辑才能与另一个使用这些数值表示此处状态的应用程序同步SQL,或者在后端的另一个系统中,如果可能的话我更愿意在这里做...

我希望我的输出看起来像这样:

order_number       state
12345                 1,2,3

如果您必须对转换进行硬编码并且没有查找 table 将州代码转换为数字,您可以只使用 case 表达式:

CASE b.state WHEN 'CA' THEN 1 WHEN 'AZ' THEN 2 WHEN 'NY' THEN 3 END

您可以在 LISTAGG() 调用中使用:

SELECT
  a.order_number, 
  LISTAGG(CASE b.state WHEN 'CA' THEN 1 WHEN 'AZ' THEN 2 WHEN 'NY' THEN 3 END, ',')
    WITHIN GROUP (ORDER BY a.order_number) AS states
FROM tableone a
JOIN tabletwo b
ON a.id = b.id
WHERE
1=1
AND a.order_number = '12345'
GROUP BY a.order_number;    

ORDER_NUMBER STATES              
------------ --------------------
12345        1,2,3               

顺便说一句,我已经冒昧地切换到正确的连接语法。此外, order by 子句目前并没有真正做任何事情,因为您正在按该值进行分组,因此它在组内始终相同;如果顺序很重要,那么您需要更改它 - 可能更改为相同的 case 表达式。