2017-08-17 13 views
0

私はこのような例を表していますSQL Serverは、1列が

Column1 Column2  Column3  Column4   Column5 
--------------------------------------------------------------- 
Dog   456   Long   Short   Small 
Car   454   Blue   NULL    NULL 
Fruit  466   Apple   Pear    NULL 

をそしてXYの列が1列に入れられますとき、私は

Column1 Column2  Column3 
------------------------------ 
Dog   456   Long 
Dog   456   Short 
Dog   456   Small 
Car   454   Blue 
Fruit  466   Apple 
Fruit  466   Pear 

をいただき、ありがとうございます。このようなテーブルを期待しますあなたの意見は、テーブルが1000行以上あるとき。

でも私は、Excelでこれを行うことができ、その後、戻ってインポートデータをSQL Serverの

答えて

3

あなたは以下のようにアンピボット使用することができます。

Select * from #unpivotdata 
unpivot(cols for col in([column3],[column4],[column5])) u 

以下のように出力します。

+---------+---------+-------+ 
| Column1 | column2 | cols | 
+---------+---------+-------+ 
| Dog  |  456 | Long | 
| Dog  |  456 | Short | 
| Dog  |  456 | Small | 
| Car  |  454 | Blue | 
| Fruit |  466 | Apple | 
| Fruit |  466 | Pear | 
+---------+---------+-------+
0
SELECT Column1, Column2, Column3 FROM table WHERE Column3 IS NOT NULL 
UNION ALL 
SELECT Column1, Column2, Column4 FROM table WHERE Column4 IS NOT NULL 
UNION ALL 
SELECT Column1, Column2, Column5 FROM table WHERE Column5 IS NOT NULL 
0

UNION ALLを使用する:

SELECT col1, col2, col3 
FROM tab 
UNION ALL 
SELECT col1, col2, col4 
FROM tab 
WHERE col4 IS NOT NULL 
SELECT col1, col2, col5 
FROM tab 
WHERE col5 IS NOT NULL; 
0

UnPivotのほうがパフォーマンスは良いですが、列数が不明な場合です。

キー」列だけが特定されているため、幅が動的であることに多くの注意があります。

Declare @YourTable Table ([Column1] varchar(50),[Column2] varchar(50),[Column3] varchar(50),[Column4] varchar(50),[Column5] varchar(50)) 
Insert Into @YourTable Values 
('Dog',456,'Long','Short','Small') 
,('Car',454,'Blue',NULL,NULL) 
,('Fruit',466,'Apple','Pear',NULL) 

Select A.[Column1] 
     ,A.[Column2] 
     ,[Column3] = C.Value 
From @YourTable A 
Cross Apply (values (cast((Select A.* for XML RAW) as xml))) B(XMLData) 
Cross Apply (
       Select Field = a.value('local-name(.)','varchar(100)') 
         ,Value = a.value('.','varchar(max)') 
       From B.XMLData.nodes('/row') as C1(n) 
       Cross Apply C1.n.nodes('./@*') as C2(a) 
       Where a.value('local-name(.)','varchar(100)') not in ('Column1','Column2') 
      ) C 

戻り

enter image description here