在T-SQL中将列转换为行(SQL 2005)

时间:2011-09-20 22:20:24

标签: sql-server-2005 tsql

试图找出如何进行查询以便以理想的方式给我结果:

Table Cars:

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(我将使用它作为数据库)。

由于

4 个答案:

答案 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

答案 1 :(得分:1)

它比你想象的要简单,你可以将这些列连接成一列,一列的值成为结果行:

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

答案 2 :(得分: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 @sql=@sql + '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

答案 3 :(得分: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