2011-09-20 70 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