2017-10-28 190 views
1

这是我的源表(pivot_dummy):SQL转动 - 如何获得多个列之间的所有可能的组合摆动

input data

,我需要通过Parameter_type转动,但需要之间的所有可能的组合Parameter_val的。把它做这样

Desired Output

什么我用这个代码:

SELECT nct_id, [Asset],[Indication], rowid 
FROM (SELECT nct_id,Parameter_val,parameter_type, rowid 
     FROM (Select *, 
        Row_Number() Over (Partition By nct_id,Parameter_type ORDER BY nct_id) RowId 
      from [dbo].[pivot_dummy] 
      ) a 
    ) s 
Pivot (
    max(parameter_val) 
     for Parameter_type in ([Asset], [Indication]) 
    ) as pivottable 

但是,这是不是给我所需的输出和之间省略了资产/主治各种组合。我也不确定如果有更多的色谱柱进入(这是非常可能的),它将如何工作,因此我正在寻找一种通用的解决方案,可以根据常见的NCT_ID找到所有param_type色谱柱中可能的组合。

任何帮助将非常感激。谢谢!

+0

这看起来像你只需要一个标准的支点查询。你尝试过什么吗? –

回答

0

这比你以前的问题更复杂,因为不是所有的ID都具有所有的值。

的诱惑是:

select pd1.nct_id, pd1.parameter_value as asset, pd2.parameter_value as indication, 
     pd3.parameter_value as BMx, pd4.parameter_value as LOT 
from pivot_dummy pd1 join 
    pivot_dummy pd2 
    on pd1.nct_id = pd2.nct_id and 
     pd1.parameter_type = 'Asset' and 
     pd2.parameter_type = 'Indication' join 
    pivot_dummy pd3 
    on pd1.nct_id = pd3.nct_id and 
     pd3.parameter_type = 'BMx' join 
    pivot_dummy pd4 
    on pd1.nct_id = pd4.nct_id and 
     pd4.parameter_type = 'LOT'; 

这只适用于具有所有四个值的ID。切换到full join可解决问题 - 但会使查询复杂化。

我认为最好的办法是left join,看起来像这样:

select pd.nct_id, pd1.parameter_value as asset, pd2.parameter_value as indication, 
     pd3.parameter_value as BMx, pd4.parameter_value as LOT 
from (select distinct nct_id from pivot_dummy 
    ) pd left join 
    pivot_dummy pd1 
    on pd1.nct_id = pd.nct_id and 
     pd1.parameter_type = 'Asset' left join 
    pivot_dummy pd2 
    on pd2.nct_id = pd.nct_id and 
     pd2.parameter_type = 'Indication' left join 
    pivot_dummy pd3 
    on pd3.nct_id = pd.nct_id and 
     pd3.parameter_type = 'BMx' left join 
    pivot_dummy pd4 
    on pd4.nct_id = pd.nct_id and 
     pd4.parameter_type = 'LOT'; 
+0

这工作就像一个魅力。谢谢!! –

相关问题