2017-03-13 26 views
1

我有两个表CX_SOLICITUD_SERVICIOCX_SOLICITUD_SALA,并且如果NU_CONS_SOSA有多个CD_CODI_SER_SOSE,我需要添加列的SQL Server查询。在Select Query中添加列的SQL Server查询

表1:CX_SOLICITUD_SERVICIO

NU_CONS_SOSA_SOSE CD_CODI_SER_SOSE 
------------------------------------ 
    777     i684000 
    777     i705210 
    777     i595101 
    778     i684000 
    778     i549201 
    756     i132300 
    763     i132300 
    758     i132300 
    761     i132300 
    761     i132301 

表2:CX_SOLICITUD_SALA

NU_CONS_SOSA    FE_FECH_SOSA 
-------------------------------------------- 
     777   2017-03-01 10:14:00.000 
     778   2017-03-04 11:14:00.000 
     756   2017-02-01 12:14:00.000 
     763   2017-01-15 14:14:00.000 
     758   2017-02-27 09:14:00.000 
     761   2017-03-01 10:14:00.000 

预期结果:

NU_CONS_SOSA CD_CODI_SER_SOSE_1 CD_CODI_SER_SOSE_2 CD_CODI_SER_SOSE_3 
     777    i684000   i684000    i595101 
     778    i684000   i549201    null 
     756    i132300   null     null 
     763    i132300   null     null 
     758    i132300   null     null 
     761    i132300   i132301    null 

我通常会尝试下面的查询,但它不工作:

SELECT 
    NU_CONS_SOSA_SOSE, CD_CODI_SER_SOSE 
FROM 
    CX_SOLICITUD_SERVICIO 
INNER JOIN 
    CX_SOLICITUD_SALA ON NU_CONS_SOSA = NU_CONS_SOSA_SOSE 
+0

每个NU_CONS_SOSA是否有最大数量的CD_CODI_SER_SOSE? – McNets

+0

我想你可能想看看枢轴子句 –

+0

是的 - 你想要枢轴; http://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server –

回答

0

使用动态SQL生成代码以pivot()CD_CODI_SER_SOSE未知最大数量:

declare @cols nvarchar(max); 
declare @sql nvarchar(max); 

    select @cols = stuff((
    select distinct 
     ',' + quotename('CD_CODI_SER_SOSE_' 
      +convert(nvarchar(10),row_number() over (
       partition by NU_CONS_SOSA_SOSE 
       order by  CD_CODI_SER_SOSE 
     )) 
     ) 
     from CX_SOLICITUD_SERVICIO 
     for xml path (''), type).value('.','nvarchar(max)') 
    ,1,1,''); 

select @sql = ' 
select NU_CONS_SOSA_SOSE, ' + @cols + ' 
    from (
    select 
     NU_CONS_SOSA_SOSE 
     , CD_CODI_SER_SOSE 
     , rn=''CD_CODI_SER_SOSE_''+convert(nvarchar(10),row_number() over (
      partition by NU_CONS_SOSA_SOSE 
      order by  CD_CODI_SER_SOSE 
     )) 
     from CX_SOLICITUD_SERVICIO 
    ) as a 
pivot (max([CD_CODI_SER_SOSE]) for [rn] in (' + @cols + ')) p'; 
select @sql as CodeGenerated; 
exec sp_executesql @sql; 

rextester演示:http://rextester.com/OFWRR74959

代码生成:

select NU_CONS_SOSA_SOSE, [CD_CODI_SER_SOSE_1],[CD_CODI_SER_SOSE_2],[CD_CODI_SER_SOSE_3] 
    from (
    select 
     NU_CONS_SOSA_SOSE 
     , CD_CODI_SER_SOSE 
     , rn='CD_CODI_SER_SOSE_'+convert(nvarchar(10),row_number() over (
      partition by NU_CONS_SOSA_SOSE 
      order by  CD_CODI_SER_SOSE 
     )) 
     from CX_SOLICITUD_SERVICIO 
    ) as a 
pivot (max([CD_CODI_SER_SOSE]) for [rn] in ([CD_CODI_SER_SOSE_1],[CD_CODI_SER_SOSE_2],[CD_CODI_SER_SOSE_3])) p 

结果:

+-------------------+--------------------+--------------------+--------------------+ 
| NU_CONS_SOSA_SOSE | CD_CODI_SER_SOSE_1 | CD_CODI_SER_SOSE_2 | CD_CODI_SER_SOSE_3 | 
+-------------------+--------------------+--------------------+--------------------+ 
|    756 | i132300   | NULL    | NULL    | 
|    758 | i132300   | NULL    | NULL    | 
|    761 | i132300   | i132301   | NULL    | 
|    763 | i132300   | NULL    | NULL    | 
|    777 | i595101   | i684000   | i705210   | 
|    778 | i549201   | i684000   | NULL    | 
+-------------------+--------------------+--------------------+--------------------+