SQL Group By 聚合到单独的列中

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

我正在使用 Postgres,并且想编写 SQL 来执行以下操作。

到目前为止我有这个:

select a.id, string_agg(concat(c.fname), ', ') as approvers 
from
autoapprovalapproverconfig a
left join autoapprovalapproverconfigmandate a2 on a2.autoapprovalaconfigurationid = a.id
left join person p on p.personid = a2.approverid
left join person_contact pc on pc.person_personid = p.personid
left join public.clientcontact c on c.contact_id = pc.personaldetails_contact_id
group by a.id

返回:

ID     APPROVERS
--     ---------
1     nameA, nameB
2     nameC
3     nameD, nameE, nameF
4     nameG
5     nameH, nameI

如何让 SQL 返回:(删除聚合函数,并将每个函数显示在单独的列中)

ID     APPROVER1   APPROVER3    APPROVER3
--     ---------   ---------    ---------
1        nameA       nameB
2        nameC
3        nameD       nameE        nameF
4        nameG
5        nameH       nameI

每行最多显示 3 个批准者。

sql postgresql
1个回答
0
投票

假设您没有在查询中执行 STRING_AGG()。在这种情况下,输出看起来像

 WITH CTE(ID,APPROVER)AS
 (
    SELECT 1,'nameA' UNION ALL
    SELECT 1,'nameB' UNION ALL
    SELECT 2,'nameC' UNION ALL
    SELECT 3,'nameD' UNION ALL
    SELECT 3,'nameE' UNION ALL
    SELECT 3,'nameF' UNION ALL
    SELECT 4,'nameG' UNION ALL
    SELECT 5,'nameH' UNION ALL
    SELECT 5,'nameI'

) 您可以使用条件聚合,如下面的查询所示

SELECT XX.ID,
MAX(
     CASE 
       WHEN XX.XCOL=1 THEN XX.APPROVER
       ELSE ''
     END   
   )AS APPROVER_1,
MAX(
    CASE 
     WHEN XX.XCOL=2 THEN XX.APPROVER
       ELSE ''
    END   
   )AS APPROVER_2,
 MAX(
     CASE 
       WHEN XX.XCOL=3 THEN XX.APPROVER
       ELSE ''
      END   
   )AS APPROVER_3
 FROM
  ( 
       SELECT C.ID,C.APPROVER,
      ROW_NUMBER()OVER(PARTITION BY C.ID ORDER BY C.APPROVER ASC)XCOL
     FROM CTE AS C 
  )XX
 GROUP BY XX.ID

如果审批者数量未定义,请谷歌“PostgreSQL动态数据透视表”

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