我正在使用 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 个批准者。
假设您没有在查询中执行 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动态数据透视表”