2012-08-23 56 views
2

我已经在这里搜寻了一遍,并且找不到任何东西。SQL查询 - 将多个列合并成一列

我没翻过来的CONCAT功能,但由于我的公司运行SQL Server 2008米中那不是一种选择:(

我有输出多列/行的查询,我想所有DISPLY结果在一个柱

例:

SELECT client, owner, payer, status 
FROM Main 
WHERE status = 'Active' 

结果:

client | owner | payer | status 

1  | 2 | 3 | Active 
10  | 11 | 12 | Active 

我希望它看起来像

ColumnX | 
1 
2 
3 
Active 
10 
11 
12 
Active 

预先感谢您的帮助,我希望是有道理的:)

干杯, 迈克尔

+1

这是一个坏主意。没有钥匙,你将不知道这些值是什么意思。你将没有排序顺序。 –

+1

我很好奇你想用这个查询做什么。也许有更好的方法来实现你的目标。 – Jim

+0

感谢您的快速回复。只是想获得一个“活跃”的数字列表,它们来自哪里并不重要。当我回来时,会尝试下面的内容。在我的桌子上! – Mikey

回答

9

你所指的是UNPIVOT。这需要在列,并将其转换为行:

SELECT value, field 
FROM 
(
    select cast(client as varchar(10)) client, 
    cast(owner as varchar(10)) owner, 
    cast(payer as varchar(10)) payer, 
    status 
    from main 
    where status = 'Active' 
) x 
unpivot 
(
    value 
    for field in (client, owner, payer, status) 
) u 

SQL Fiddle with Demo

UNPIVOT会给你一个列值的列表,然后将其从其他附带的列。

UNPIVOT需要的东西是所有字段都是相同的数据类型,所以您需要执行数据类型的转换,以便它们可以呈现在同一列中。

你也可以使用一个UNION ALL执行此操作,但你又需要cast()的数据类型是相同的:

SELECT cast(client as varchar(10)) value 
FROM main 
WHERE status = 'active' 
UNION ALL 
SELECT cast(owner as varchar(10)) value 
FROM main 
WHERE status = 'active' 
UNION All 
SELECT cast(payer as varchar(10)) value 
FROM main 
WHERE status = 'active' 
UNION ALL 
SELECT status 
FROM main 
WHERE status = 'active' 

SQL Fiddle with Demo

+0

@Aaron Bertrand感谢您的编辑。 – Taryn

+0

当然,但你把它推回去了。 :-) –

+0

@AaronBertrand我想因为我也在编辑它。我们需要在编辑时锁定帖子的原因。 :) – Taryn