2011-09-20 65 views
0

试图找出如何做一个查询给我期望的方式结果:转换列成行的T-SQL(SQL 2005)

表汽车:

car_id Make Model Color 
1 Ford Focus Red 
2 Ford Fiesta Silver 
3 Honda Accord Silver 

从选择汽车其中car_id = 1

Car_id 1 
Make Ford 
Model Focus 
Color Red 

所以非常需要一个列并将其转换为一行。使用SQL 2005(我正在使用新版本)作为数据库。

感谢

+0

将文本格式设置为需要换行符保存的代码。 –

回答

2

这里有一个简单的方法:

;with a as 
(
    select id, make, model, color 
    from cars 
    where id = 1 
) 
select 'Car_id' [Col1], cast(Car_id as varchar(10)) [Col2] 
from a 
union all 
select 'make', make 
from a 
union all 
select 'Model', Model 
from a 
union all 
select 'Color', Color 
from a 
+0

我得到了这个错误消息“转换失败时,将varchar值'福特'转换为数据类型int。”,并认为它使第一列类型int。铸造car_id作为varchar让它为我工作。谢谢 现在看看我是否可以在将三张表连接在一起的同时工作。 –

1

其simplier比你想象的,你可以连接这些列成一列,一个列的值变为结果行:

SELECT CarModel + ' ' + CarMake + ' ' + CarColor AS MyColumn FROM MyTable

+0

这工作,如果我想单行返回,但我想为每个列的行。所以,如果我通过car_id = 1进行过滤,我会得到一行,但我实际上想要返回4行。 希望是有道理的。 –

+0

@Wayne在ML - 这没有任何意义,我的解决方案将适用于每一个当前行。假设你在桌上有4辆汽车,你会得到4排汽车的车型和每辆车的颜色。 – JonH

+0

我厌倦了您的查询使用表car_id = 1。我得到了一行返回。创建表#cars(car_id int,make varchar(10),model varchar(10),color varchar(10))insert into #cars values(1,'Ford','Focus','Red')insert into #cars值(2,'福特','嘉年华','银')插入#cars值(3,'Honda','Accord','Silver')SELECT Model +''+ Make +''+ Color AS MyColumn FROM #cars where car_id = 1 DROP表#cars –

0

declare @mytable table(car_id int, Make varchar(10), model varchar(10), color varchar(10)) 

insert @mytable values(1,'Ford','Focus','Red') 
insert @mytable values(2,'Ford','Fiesta','Silver') 
insert @mytable values(3,'Honda','Accord','Silver') 

select 'Car_id ' +convert(varchar, car_id)+char(10)+char(13)+ 
'Make ' + Make + char(10)+char(13)+ 
'Color '+color 
from @mytable 
where car_id = 1 
+0

谢谢,但给了我与第一个建议相同的结果。 –

1

我们可以为任何查询编写通用解决方案。

--sample table 
SELECT * INTO #cars 
FROM ( SELECT 1 car_id, 'Ford' Make, 'Focus' Model,'Red' Color 
    UNION all 
    SELECT 2 car_id, 'Ford' Make, 'Fiesta' Model,'Silver' Color 
    UNION ALL 
    SELECT 3 car_id, 'Honda' Make, 'Accord' Model,'Silver' Color 
    ) x 

--selected record to #tmp 
SELECT * INTO #tmp FROM #cars WHERE car_id=1 

--generic solution 
DECLARE @sql VARCHAR(max) 
SET @sql='' 
SELECT @[email protected] + 'SELECT '''+Name+''' as ColumnName, 
    cast(['+Name+'] as varchar(500)) as Value FROM #tmp union all ' 
FROM tempdb.sys.columns 
where object_id=object_id('tempdb..#tmp') 

SET @sql = LEFT(@sql,LEN(@sql)-9) -- except last 'union all' 

EXEC(@sql) 

DROP TABLE #tmp,#cars 
+1

欢迎来到堆栈溢出。您可以通过在代码行之前放置四个空格来对代码进行格式化,引擎将负责处理其余的代码。我为你编辑它,但不得不问......你真的试图把你的答案放在BLINK标签内吗?那里很有趣。 – RThomas