2009-10-16 7 views
8

私は周りを探索していましたが、私の問題に似たものを見つけましたが、本当の解決策を得るためにはもっと助けが必要です。行を列として選択するにはどうすればよいですか?

2つのデータ列を返すクエリを作成しようとしています。最初の列は列名自体のリストで、2番目の列はその列の値でなければなりません。

視覚的にそれは私がこれを達成するために、動的SQLを要求しようとしていることをかなり確信しているこの

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

ように見えるだろうが、私も、クエリの作成を開始する方法は考えています。

ご協力いただきましてありがとうございます。

+0

あなたの質問には実際の詳細はありません。あなたはどのテーブルを扱っていますか、そして列データ型は何ですか? SQL Serverのバージョンも、pls。 –

+1

具体的にどのバージョンのSQL Serverですか?そして、あなたは1行のデータしか持っていないか、列1は列名になり、他のすべての列はその列のデータになりますか? –

+0

私は行を列にピボットしたいが、列は行にピボットしたいと理解できますか?実際に何をしようとしていますか? –

答えて

5

ような何かを行うことができますが、私の例では、私はちょうどテストを作成します。 @YourTableName内にテーブル名を設定する必要があります。また、@ YourTableWhereを設定して結果を1つの行に限定する必要があります。そうしないと、複数の行が混在した出力が不思議に見えます。

この試す:8000(SQL Server 2000の互換性のため

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 

EDIT

、あなたがvarchar型とvarchar型(max)を置き換えることができる必要があります:OUTPUT

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) 

を)上記のコードのSELECT @YourQueryクエリの代わりにこれを使用してください:

それは、SQL ServerのXML機能を使用しないため
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(1000)とFOR XML PATH( ' )も動作しません。私はそれを回避する方法がわかりません... – Shaded

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

My answer to this question 10は、SQL Server 2000でより簡単に動作しますあなたはあなたのレポートと何をしているを提示しているかについて非常に明確ではない2005年

0

それを生成する。あなたは "レポート"を生成するためにクエリツールの直接の結果を使用していますか?その場合は、ドライバーを使って釘を打ちようとしています。ジョブには適切なツールを使用します。

SQL言語は、レポートを生成するためにプレゼンテーションデータをセットアップするために直接使用するべきではありません。本当に、それはばかげた考えです。 のレポートをまっすぐに書いても、になるはずがありません。

自分で作成したアプリケーションプログラムやCrystal Reportsなどのレポート生成ツールを使用して、レポートを生成するのは本当にすべきです。

自分で書かれたアプリケーションプログラム:カーソルオブジェクトを使用してデータベースに照会する場合は、そのカーソルオブジェクトから列名を取得するだけです。問題が解決しました。

レポート生成ツール:通常、レポート生成ツールは、表示される可能性のある動的データを表す機能を提供します。

いずれにせよ、あなたはこれに対するあなたのアプローチを再考する必要があると思います。

関連する問題