在 SQL 服务器上旋转动态列

Pivot Dynamic Columns on SQL Server

我有 3 个这样的 table,

1:贷款计划

id                                      Name               
------------------------------------    --------------------------------
9C374820-357B-46FE-B509-003B9DB1507F    FHA 30 YEAR FIXED HIGH BALANCE
B8A76A63-D867-4D89-9749-018238C446B5    JUMBO 10/1 YR ARM BARCLAYS
458AA688-AF12-438D-AFA3-01C804E9C6F6    JUMBO EXPANDED PLUS 30 YEAR FIXED
D8D6D621-6D14-493B-AAA8-02285EC9A54D    z_Test_FHA_30_Year_SL
8C735061-3CA2-4065-ABBF-03CF4234BD36    CONF 15 YR 105 DU REFI PLUS

2:渠道

Id                                      Name
------------------------------------    -------------
DCBAD5E8-91B1-4EC6-8545-4265367EFFCD    Broker
0BC94231-C174-41DE-A9C5-980C7834B55A    Correspond
6000F785-0D98-4DA6-8431-B13F01295EFE    Retail

3: LoanProgramChannels

Loanprogram_Id                           Channel_id
------------------------------------   ------------------------------------
9C374820-357B-46FE-B509-003B9DB1507F    DCBAD5E8-91B1-4EC6-8545-4265367EFFCD
9C374820-357B-46FE-B509-003B9DB1507F    0BC94231-C174-41DE-A9C5-980C7834B55A
458AA688-AF12-438D-AFA3-01C804E9C6F6    0BC94231-C174-41DE-A9C5-980C7834B55A
D8D6D621-6D14-493B-AAA8-02285EC9A54D    6000F785-0D98-4DA6-8431-B13F01295EFE

我必须将结果显示如下。列出所有贷款计划,如果贷款计划在 'LoanProgramChannel' table 中有特定频道的条目,则将其标记为 "Y",否则标记为 "N"。我对 SQL 很陌生,我知道我必须使用 pivot 函数来实现这些。但不确定我该如何实现?

Loan Program Name                     Broker   Correspond  Retail
--------------------                 -------  ---------   -------
FHA 30 YEAR FIXED HIGH BALANCE       y             y          N
JUMBO 10/1 YR ARM BARCLAYS           N             N          N
JUMBO EXPANDED PLUS 30 YEAR FIXED    N             y          N
z_Test_FHA_30_Year_SL                N             N          Y
CONF 15 YR 105 DU REFI PLUS          N             N          N

请试试这个查询。它使用 SQL PIVOT 以及一个简单的 ISNULL 检查获取错误值

    SELECT 
        [Loan Program Name],
        ISNULL([Broker],'N') as [Broker],
        ISNULL([Correspond],'N') as [Correspond],
        ISNULL([Retail],'N') as [Retail]
    FROM
        (
            SELECT 
                L.Name as [Loan Program Name],
                'Y' as v,C.Name  as [ChannelType] 
            FROM LoanPrograms L LEFT JOIN LoanProgramChannels LC 
                ON L.id =LC.Loanprogram_Id  LEFT JOIN Channels C 
                ON C.id=LC.Channel_id
        ) S
        PIVOT
        (
            MAX(v) FOR [ChannelType] IN ([Broker],[Correspond],[Retail])
        )piv

我也创建了一个 fiddle : http://sqlfiddle.com/#!6/3e6c6/2