2012-04-26 54 views
0

我有一个记录DCP_SC_DOT_TBL,其中有2个键SETIDCONTRACTID。除此之外,还有78个列是复选框,其中包含值YBlank。例如:从列到行的数据转换

SETID CONTRACTID 1 2 3 ...... 78 
DCPID 00102  Y  Y 
DCPID 00192   Y Y   Y 

现在我想删除所有这些列,并创建一个新的行对于每个非空列创建一个表,例如,像这样:

SETID CONTRACTID Checkbox(New column for all the 78 columns) 
DCPID 00102  1 
DCPID 00102  3 
DCPID 00192  2 
DCPID 00192  3 
DCPID 00192  78 

可有人请建议如何实现这一目标?我只想要包含针对CONTRACTID的某些数据的列。

回答

0

在重新阅读您的文章,这听起来像你只需要一个大的联合查询:

Select SetId, ContractId, '1' As ColNum, 
From SomeTable As S1 
Where S1.Col1 = 'Y' 
Union All 
Select SetId, ContractId, '2' 
From SomeTable As S1 
Where S1.Col2 = 'Y' 
Union All 
Select SetId, ContractId, '3' 
From SomeTable As S1 
Where S1.Col3 = 'Y' 
... 
Union All 
Select SetId, ContractId, '78' 
From SomeTable As S1 
Where S1.Col78 = 'Y' 

如果你想导致主表等信息,那么你会加入这个结果集它:

Select 
From SomeTable As S 
     Join (
       Select SetId, ContractId, '1' As ColNum, 
       From SomeTable As S1 
       Where S1.Col1 = 'Y' 
       Union All 
       Select SetId, ContractId, '2' 
       From SomeTable As S1 
       Where S1.Col2 = 'Y' 
       Union All 
       Select SetId, ContractId, '3' 
       From SomeTable As S1 
       Where S1.Col3 = 'Y' 
       ... 
       Union All 
       Select SetId, ContractId, '78' 
       From SomeTable As S1 
       Where S1.Col78 = 'Y' 
       ) As Z 
      On Z.SetId = S.SetId 
       And Z.ContractId = S.ContractId