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

Sql server 2005 在T-SQL(SQL 2005)中将列转换为行,sql-server-2005,tsql,Sql Server 2005,Tsql,正在尝试找出如何执行查询,以便以所需的方式向我提供结果: 桌车: 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作为数据库,这是我最新使用的 感

正在尝试找出如何执行查询,以便以所需的方式向我提供结果:

桌车:

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作为数据库,这是我最新使用的


感谢

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


从MyTable中选择CarModel+''+CarMake+''+CarColor作为MyColumn

比您想象的更简单,您可以将这些列连接到一列中,一列的值成为结果行:

从MyTable中选择CarModel+“”+CarMake+“”+CarColor作为MyColumn

;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
这里有一个简单的方法:

;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
怎么样

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
怎么样

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

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

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

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

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


将文本格式化为需要保留换行符的代码。将文本格式化为需要保留换行符的代码。如果我希望返回一行,但我希望这些列中的每一列都有一行,则可以这样做。所以,如果我按car_id=1过滤,我会有一行,我实际上想要得到4行。希望这有意义。@Wayne In ML-这没有意义,我的解决方案将适用于当前的每一行。假设表中有4辆车,那么每辆车的车型、品牌和颜色将有4行。我正好得到一排回音。创建表格cars car_id int,使varchar10、varchar10型、颜色varchar10插入到汽车值1、'福特'、'福克斯'、'红色'插入到汽车值2、'福特'、'嘉年华'、'银色'插入到汽车值3、'本田'、'雅阁',“Silver”从car_id=1的汽车中选择Model+''+Make+''+Color作为MyColumn下拉表carsWell格式不符合要求。。但是如果你把我的评论从CreateTable开始复制到最后,将其弹出到一个查询窗口并运行它,你会得到一行返回,三个字段合并成一行。我希望,当我运行car_id=1的查询时,我会得到一行,其中有两列,make和Ford,第二行有两列,模型和嘉年华,最后一行有两列,颜色和红色。如果我想要返回一行,那么这是可行的,但是我想要为每一列返回一行。所以,如果我按car_id=1过滤,我会有一行,我实际上想要得到4行。希望这有意义。@Wayne In ML-这没有意义,我的解决方案将适用于当前的每一行。假设表中有4辆车,那么每辆车的车型、品牌和颜色将有4行。我正好得到一排回音。创建表格cars car_id int,使varchar10、varchar10型、颜色varchar10插入到汽车值1、'福特'、'福克斯'、'红色'插入到汽车值2、'福特'、'嘉年华'、'银色'插入到汽车值3、'本田'、'雅阁',“Silver”从car_id=1的汽车中选择Model+''+Make+''+Color作为MyColumn下拉表carsWell格式不符合要求。。但是如果你把我的评论从CreateTable开始复制到最后,将其弹出到一个查询窗口并运行它,你会得到一行返回,三个字段合并成一行。我希望,当我运行car_id=1的查询时,我会得到一行,其中有两列,make和Ford,第二行有两列,模型和嘉年华,最后一行有两列,颜色和红色。谢谢,但给出的结果与第一个建议相同。谢谢,但给出的结果与第一个建议相同。我在将varchar值“Ford”转换为数据类型int时收到此错误消息转换失败。,我想这是第一个列类型int.Casting car_id,因为varchar让它为我工作。感谢您现在查看我是否可以在AttMe选择将三个表连接在一起时使其工作。我在将varchar值“Ford”转换为数据类型int时收到此错误消息转换失败,并认为它正在生成第一列类型int。将car_id转换为varchar使其工作。现在,感谢您在尝试将三个表连接在一起时,看看我是否可以使其正常工作。欢迎使用堆栈溢出。您可以通过在代码行之前放置四个空格来格式化代码,引擎将处理其余部分。我为你编辑了它,但不得不问。。。你真的试着把你的答案放在眨眼标签里吗???这很有趣。欢迎来到堆栈溢出。您可以通过在代码行之前放置四个空格来格式化代码,引擎将处理其余部分。我为你编辑了它,但不得不问。。。你真的试着把你的答案放在眨眼标签里吗???这很有趣。