2016-09-01 6 views
0

を単一の列を分割する私のようなSQL Serverのテーブルtable_nameがあります。私は何をしたいかどのように複数の列に

col1   col2 
SomeString_1 23 
SomeString_1 65 
SomeString_1 300 
SomeString_1 323 

するcol1の内の1つのユニークな値のために、私はCOL2からすべての値を選択したいされているが、それぞれがそれ自身の列です。

だから、クエリのようなものでなければなりません:

select col2 from table_name where col1 = 'SomeString_1'; 

しかし、私は形式で出力必要があります。基本的には、選択された各値は、それ自身のコラムであるべき

23 65 300 323 

を。したがって、結果には常に1行があり、SomeString_1と同じ数の列が繰り返されます。

私はSO上で検索しようとしましたが、条件が異なることがほとんど見つかりませんでした。

+3

[SQLSERVERでLISTAGG]の可能な重複(HTTP:// stackoverflowの.com/questions/15477743/listagg-in-sqlserver) –

+0

[Simulating group \ _concat SQL関数をSQL Serverでシミュレートしますか?](http://stackoverflow.com/questions/451415/simulating-group-concat-mysql- function-in-sql-server) – kbball

+1

ここであなたの答えを見つけることができます[効率的にSQL Serverの行に列を変換する](http://stackoverflow.com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server) – Munavvar

答えて

2

OPは、各列の値のための別個の列の値を求めているように思える:

create table #Table1 (COL1 VARCHAR(100), COL2 VARCHAR(10)) 
INSERT INTO #Table1 VALUES ('SomeString_1', '23'), 
          ('SomeString_1', '65'), 
          ('SomeString_1', '300'), 
          ('SomeString_1', '323') 

DECLARE @columns nvarchar(MAX) = STUFF((
SELECT DISTINCT ',[col-' + cast(row_number() over (order by (select 1)) as varchar(4))+']' 
FROM #Table1 
FOR XML PATH('')), 1, 1, '') 

DECLARE @sql nvarchar(MAX) = N' 
SELECT * FROM 
(
    SELECT col2, ''col-'' + cast(row_number() over (order by (select 1)) as varchar(4)) as dupcol2 
    FROM #Table1 where col1 = ''SomeString_1'' 
) T 
PIVOT 
(MAX(col2) FOR dupcol2 IN ('[email protected]+')) P' 

EXEC (@sql) 

出力:

col-1 | col-2 | col-3 | col-4 
------------------------------ 
23 | 65 | 300 | 323 
+0

はい、あなたはは正しい。私は各行の値ごとに別々の列の値を持つことを検討しています。あなたの提案されたソリューションが私のために最適です。しかし、何とかcol-10、col-11、... col-20、col-21、... col-30、col-31、... col-40、col- 14、....それらにNULL値があります。私も正しい値でcol-1、col-2、col-3、col-4を得ます。 – 300

+0

両方の場所で 'WHERE COL2 is not null'のフィルタを追加します。 – p2k

+0

FROMの後に追加しましたが、それでも同じ結果が表示されます。 – 300

2

アプローチはFOR XMLを使用して適用することができます。

SELECT DISTINCT t.COL1, 
     (SELECT t1.COL2 + ' ' AS 'data()' 
     FROM @TBL t1 
     WHERE t.COL1 = t1.COL1 
     FOR XML PATH('')) 
FROM @TBL t 
WHERE t.COL1 = 'SomeString_1' 

たとえば、返し

DECLARE @TBL TABLE (COL1 VARCHAR(100), COL2 VARCHAR(10)) 
INSERT INTO @TBL VALUES ('SomeString_1', '23'), 
         ('SomeString_1', '65'), 
         ('SomeString_1', '300'), 
         ('SomeString_1', '323') 

SELECT DISTINCT t.COL1, 
     (SELECT t1.COL2 + ' ' AS 'data()' 
     FROM @TBL t1 
     WHERE t.COL1 = t1.COL1 
     FOR XML PATH('')) 
FROM @TBL t 
WHERE t.COL1 = 'SomeString_1' 

COL1   (No column name) 
SomeString_1 23 65 300 323 
0

また、COALESCEを使用することができます。..

DECLARE @Names VARCHAR(8000) 

SELECT @Names = COALESCE(@Names + ' ', '') + COL2 
FROM YourTable 
WHERE COL1 = 'SomeString_1' 

SELECT @Names 
関連する問題