2009-10-16 171 views
8

因此,我一直在四處搜尋,發現類似於我的問題,但我需要更多幫助才能獲得真正的解決方案。如何選擇列作爲行?

我想構建一個將返回2列數據的查詢,第一列應該是列名稱本身的列表,第二列應該是該列的值。

視覺上看起來像這樣

Column1  Column2 
-------  ------- 
columnA  value_of_columnA 
columnB  value_of_columnB 
...   ... 

我敢肯定,這將需要動態SQL來實現,但我不知道如何甚至開始創建查詢。

任何幫助表示讚賞!

+0

你的問題缺乏任何真實的細節 - 你正在處理哪些表,以及列數據類型是什麼?請參閱SQL Server的版本。 – 2009-10-16 14:49:04

+1

具體是什麼版本的SQL Server?你是指望只有1行的數據,或將列1列的名稱和所有其他列該列的數據? – 2009-10-16 14:50:27

+0

我可以理解想要將行轉換爲列,但將列轉換爲行?你究竟在做什麼? – 2009-10-16 14:52:25

回答

5

這應該對任何工作表中,但在我的例子中,我只是創建一個測試之一。您需要在@YourTableName中設置表名。此外,您需要設置@YourTableWhere將結果限制爲一行,否則輸出看起來很奇怪,並且混合了多行。

試試這個:

BEGIN TRY 
CREATE TABLE YourTestTable 
(RowID  int primary key not null identity(1,1) 
,col1  int null 
,col2  varchar(30) 
,col3  varchar(20) 
,col4  money 
,StatusValue char(1) 
,xyz_123  int 
) 
INSERT INTO YourTestTable (col1,col2,col3,col4,StatusValue,xyz_123) VALUES (1234,'wow wee!','this is a long test!',1234.56,'A',98765) 
INSERT INTO YourTestTable (col1,col2,col3,col4,StatusValue,xyz_123) VALUES (543,'oh no!','short test',0,'I',12) 

END TRY BEGIN CATCH END CATCH 

select * from YourTestTable 


DECLARE @YourTableName varchar(1000) 
DECLARE @YourTableWhere varchar(1000) 
DECLARE @YourQuery  varchar(max) 

SET @YourTableName='YourTestTable' 
set @YourTableWhere='y.RowID=1' 

SELECT 
    @YourQuery = STUFF(
         (SELECT 
          ' UNION ' 
          + 'SELECT '''+COLUMN_NAME+''', CONVERT(varchar(max),'+COLUMN_NAME+') FROM '[email protected]+' y'+ISNULL(' WHERE '[email protected],'') 
          FROM INFORMATION_SCHEMA.COLUMNS 
          WHERE table_name = @YourTableName 
          FOR XML PATH('') 
         ), 1, 7, '' 
        ) 

PRINT @YourQuery 

EXEC (@YourQuery) 

OUTPUT:

RowID  col1  col2       col3     col4     StatusValue xyz_123 
----------- ----------- ------------------------------ -------------------- --------------------- ----------- ----------- 
1   1234  wow wee!      this is a long test! 1234.56    A   98765 
2   543   oh no!       short test   0.00     I   12 

SELECT 'RowID', CONVERT(varchar(max),RowID) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col1', CONVERT(varchar(max),col1) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col2', CONVERT(varchar(max),col2) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col3', CONVERT(varchar(max),col3) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'col4', CONVERT(varchar(max),col4) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'StatusValue', CONVERT(varchar(max),StatusValue) FROM YourTestTable y WHERE y.RowID=1 UNION SELECT 'xyz_123', CONVERT(varchar(max),xyz_123) FROM YourTestTable y WHERE y.RowID=1 

----------- ------------------------ 
col1  1234 
col2  wow wee! 
col3  this is a long test! 
col4  1234.56 
RowID  1 
StatusValue A 
xyz_123  98765 

編輯

對於SQL Server 2000兼容,你應該能夠取代VARCHAR VARCHAR(最大)(8000 )並使用此代替上述代碼中的SELECT @YourQuery查詢:

SELECT 
    @YourQuery=ISNULL(@YourQuery+' UNION ','') 
     + 'SELECT '''+COLUMN_NAME+''', CONVERT(varchar(max),'+COLUMN_NAME+') FROM '[email protected]+' y'+ISNULL(' WHERE '[email protected],'') 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = @YourTableName 
+0

這看起來正是我所需要的...除了...我使用MSSQL 2000數據庫,所以varchar(max)不起作用*儘管我用varchar(1000)和FOR XML PATH('' )也不起作用。我不知道如何避開那個... – Shaded 2009-10-16 21:19:57

2
select column_name,* from information_schema.columns 
where table_name = 'TheTableName' 
order by ordinal_position 
0

你總是可以做這樣的事情

SELECT 'Column_Name' AS ColumnName, 
    (SELECT TOP 1 Column_Name FROM Table tbl2 WHERE tbl.ID = tbl2.ID) 
FROM Table tbl 
0

你是不是你如何展示你的報告,你是什麼很清楚用它生成它。您是否使用查詢工具的直接結果來生成「報告」?在這種情況下,你想用螺絲刀敲擊指甲。使用正確的工具來完成這項工作。

不應使用SQL語言來設置演示數據以生成報告。真的,這是一個愚蠢的想法。事實上,你可以用直寫SQL語句編寫報表並不意味着你應該應該

您真的應該使用自己編寫的應用程序或像Crystal Reports這樣的報表生成工具生成報表。

自己編寫的應用程序:如果您使用遊標對象來查詢數據庫,您可以簡單地從該遊標對象中獲取列名稱。問題解決了。

報告生成工具:通常它們提供一種工具來表示可能出現的動態數據。

無論哪種方式,我認爲你需要重新思考你的方法。