SQL服务器如何枢轴联合查询

SQL Server how to pivot joint query

我有一个查询 运行 来自不同 table 的连接:

select 
    b.first_name, d.client_fullname, a.plan_id, c.joint_info 
from 
    PLAN_INFO a 
inner join 
    JHI_USER b on a.created_by = b.login 
left join 
    PLAN_INFO_CLIENT c on c.plan_id = a.plan_id
                       and c.plan_id is not null
left join 
    CLIENT d on d.client_id = c.client_id
left join 
    CLIENT_ADDRESS_DET e on e.client_id = d.client_id 
order by 
    a.plan_id ASC

这是结果

client_fullname | plan_id | joint_info
----------------+---------+------------
venus           | 992     | M
Ric             | 992     | J1
Ricardo         | 992     | J2
Hisa            | 992     | J3

M为主,J1为联合一,J2为联合二,此记录为联合户口,更清楚。

我需要将我的 J2 名称移动到我的第 3 列,如下所示:

    client_fullname | plan_id | joint_name
    venus           | 992     | Ric

只需要显示j1。

试图阅读枢轴示例但有点卡在这里

尝试这样的事情

WITH CTE AS (

    select b.first_name,d.client_fullname,a.plan_id,
     c.joint_info 
    from PLAN_INFO a 
    inner join JHI_USER b on  a.created_by = b.login
    left join PLAN_INFO_CLIENT c
    on c.plan_id =a.plan_id
    and c.plan_id is not null
    left join CLIENT d 
    on d.client_id =c.client_id
    left join CLIENT_ADDRESS_DET e
    on e.client_id = d.client_id 
    order by a.plan_id ASC
    )

    select client_fullname,plan_id,
    (select client_fullname  from cte b where a.plan_id=b.plan_id and 
    b.joint_info='J1') as joint_name  
    from cte a 
    where joint_info='M'

您可以为此使用条件聚合。

SELECT MAX(CASE
               WHEN c.joint_info = 'M'
               THEN d.client_fullname
           END) AS client_fullname,
       a.plan_id,
       MAX(CASE
               WHEN c.joint_info = 'J1'
               THEN d.client_fullname
           END) AS joint_name
FROM   PLAN_INFO a
       INNER JOIN JHI_USER b ON a.created_by = b.login
       LEFT JOIN PLAN_INFO_CLIENT c ON c.plan_id = a.plan_id
                                       AND c.plan_id IS NOT NULL
       LEFT JOIN CLIENT d ON d.client_id = c.client_id
       LEFT JOIN CLIENT_ADDRESS_DET e ON e.client_id = d.client_id
GROUP BY a.plan_id
ORDER BY a.plan_id ASC;