如何将单列拆分为多列

时间:2016-09-01 17:57:45

标签: sql sql-server

我有一个SQL Server表table_name,如:

col1            col2
SomeString_1    23
SomeString_1    65
SomeString_1    300
SomeString_1    323

我想要做的是col1中的一个唯一值,我想从col2中选择所有值,但每个值都在其自己的列中。

所以查询应该是这样的:

select col2 from table_name where col1 = 'SomeString_1';

但我需要以下列形式输出:

23  65  300 323

基本上每个选定的值都应该在它自己的列中。因此,结果应始终有一行,并且重复SomeString_1的列数。

我试图在SO上搜索,但我找到的问题却很少。

3 个答案:

答案 0 :(得分:2)

可以使用can't use constants

应用一种方法
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 

返回,

{{1}}

答案 1 :(得分: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 ('+@columns+')) P'

EXEC (@sql)

输出:

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

答案 2 :(得分:1)

您也可以使用COALESCE ..

var json = "[{ \"thing1\": \"f\",\"thing2\" : \"x\"},{ \"thing1\": \"c\",\"thing2\" : \"bx\"}]";