2015-07-30 4 views
0

У меня есть таблицы, как этиPivoting, Динамические столбцы в SQL Server

LoanPrograms

Id Name  
------------ 
1 LP1   
2 LP2   
3 LP3   

Каналы

Id Name 
---------- 
4 Channel1 
5 Channel2 
6 Channel3 

LoanProgramsChannels

LoanProgramId  Channelid 
---------------------- 
1     4 
1     5 
2     4 

Я хотел бы получить данные, как они

LoanProgarmNames channel1 channel2 channel3 
---------------- -------- -------- -------- 
LP1     y   y  N 
LP2     y   N  N 
LP3     N   N  N 

Я совсем новичок в SQL, я знаю, что я должен использовать PIVOT для достижения этих, но не знает, как я могу достичь в этом сценарии. Может ли кто-нибудь помочь в этом?

+0

Его мне не ясно, что вы пытаетесь достичь на выходе. Это может помочь, если вы объясните, чтобы сделать его более ясным. – Mark

+0

«Y» и «N» в столбцах канала против программ кредитования показывают, имеет ли эта конкретная программа кредитования запись в таблице «LoanProgramChannels». –

ответ

0

Потому что вам нужно «заполнить пробелы» лучший способ создать декартово произведение с помощью CROSS JOIN:

;WITH CTE AS (
SELECT A.NAME AS LOANPROGRAMNAME 
, B.NAME AS CHANNELNAME 
, CASE WHEN C.CHANNELID IS NULL THEN 'N' ELSE 'Y' END AS LOANPROGRAMCHANNELS 
FROM LOANPROGRAMS AS A 
CROSS JOIN CHANNELS AS B 
LEFT JOIN LOANPROGRAMSCHANNELS AS C 
ON CAST(A.ID AS VARCHAR)+CAST(B.ID AS VARCHAR) = 
CAST(C.LOANPROGRAMID AS VARCHAR)+CAST(C.CHANNELID AS VARCHAR)) 
SELECT LOANPROGRAMNAME, [CHANNEL1], [CHANNEL2], [CHANNEL3] 
FROM CTE 
PIVOT(MAX(LOANPROGRAMCHANNELS) FOR CHANNELNAME IN ([CHANNEL1], [CHANNEL2], [CHANNEL3])) PIV 

После того, как вы получили условие (Y/N) вы можете откинуть требуемые столбцы, как это делается здесь.

0

Там может быть более эффективные способы кодировать, но я считаю, что следующее обеспечит то, что вы хотите:

declare @tbLoanPrograms table (
    ID int, Name varchar(12) 
) 

insert into @tbLoanPrograms (
    ID  , Name 
) 
values (1, 'LP1') 
     , (2, 'LP2') 
     , (3, 'LP3') 

declare @tbChannels table (
    ID int, Name varchar(12) 
) 

insert into @tbChannels (
    ID  , Name 
) 
values (4, 'Channel1') 
     , (5, 'Channel2') 
     , (6, 'Channel3') 

declare @tbLoanProgramsChannels table (
    LoanProgramId int, Channelid int 
) 

insert into @tbLoanProgramsChannels (
    LoanProgramId  , Channelid 
) 
values (1, 4) 
     , (1, 5) 
     , (2, 4) 

select 
    t.Name 
    , Channel1 = max(Channel1) 
    , Channel2 = max(Channel2) 
    , Channel3 = max(Channel3) 
from (
    select 
     lp.Name 
     , Channel1 = 
       case 
       when lpc.LoanProgramId is not null and lpc.Channelid = 4 
        then 'y' 
       else 'N' 
      end 
     , Channel2 = 
      case 
       when lpc.LoanProgramId is not null and lpc.Channelid = 5 
        then 'y' 
       else 'N' 
      end 
     , Channel3 = 
      case 
       when lpc.LoanProgramId is not null and lpc.Channelid = 6 
        then 'y' 
       else 'N' 
      end 
    from 
     @tbLoanPrograms lp 
     left join @tbLoanProgramsChannels lpc on lpc.LoanProgramId = lp.ID 
     left join @tbChannels c on c.ID = lpc.Channelid 
) t 
group by t.Name