2012-02-27 6 views
2

私は別の投稿でこの質問をしましたが、変更されました。 私は3つのテーブルがあります。行ごとにではなく、列の異なる列でクエリ結果を表示するにはどうすればよいですか?

Flight table 
FlightId int 
FlightNumber varchar(10) 

FlightCapacity table 
ID int 
FlightIdRef int 
ClassIdRef int 
Capacity int 

Class Table 
ClassId int 
Name  varchar(10) 

Class Table: 
ClassId  Name 
    1   Y 
    2   A 

Flight Table 
FlightId Number 
1   123 
2   423 

FlightCapacity Table 
Id FlightIdRef ClassIdref Capacity 
1  1    1   10 
2  1    2   20 
3  2    2   10 

を、これは単純なクエリです:

select Flight.FlightNumber,Class.Name+RTRIM(FlightCapacity.Capacity) 
    from Flight 
     inner join FlightCapacity 
      on Flight.FlightId=FlightCapacity.FlightIdRef 
       inner join Class 
        on FlightCapacity.ClassIdRef=Class.ClassId 

が、私は次のような結果が欲しい:(私は1つの行にすべての飛行と能力のすべてのクラスを表示したいが、異なる列で)

FlightNumber  ClassNameAndCapacity1 ClassNameAndCapacity2 ClassNameAndCapacityn 
    123     Y10       A20      
    423     Y10       ---      

答えて

2
たぶん

このような何か:

まずいくつかのテストデータ:その後、

DECLARE @query NVARCHAR(4000)= 
N'SELECT 
    * 
FROM 
(
SELECT 
    Flight.FlightNumber, 
    Class.Name+CAST(FlightCapacity.Capacity AS VARCHAR(100)) AS ClassName, 
    ''ClassNameAndCapacity''+CAST(Class.ClassId AS VARCHAR(10)) AS ClassAndCapacity 
FROM 
    Flight 
    JOIN FlightCapacity 
     ON Flight.FlightId=FlightCapacity.FlightIdRef 
    JOIN Class 
     ON FlightCapacity.ClassIdRef=Class.ClassId 
) AS p 
PIVOT 
(
    MAX(ClassName) 
    FOR ClassAndCapacity IN('[email protected]+') 
) AS pvt' 

EXECUTE(@query) 

そして:

DECLARE @cols VARCHAR(MAX) 
SELECT @cols = COALESCE(@cols + ','+ 
       QUOTENAME('ClassNameAndCapacity'+CAST(ClassId AS VARCHAR(10))), 
       QUOTENAME('ClassNameAndCapacity'+CAST(ClassId AS VARCHAR(10)))) 
FROM 
    Class 

delcaringをし、動的SQLを実行します。

CREATE TABLE Flight(FlightId int,FlightNumber varchar(10)) 
CREATE TABLE FlightCapacity(ID int,FlightIdRef int,ClassIdRef int,Capacity int) 
CREATE TABLE Class(ClassId int,Name varchar(10)) 

INSERT INTO Class VALUES(1,'Y'),(2,'A') 
INSERT INTO Flight VALUES(1,123),(2,423) 
INSERT INTO FlightCapacity VALUES(1,1,1,10),(2,1,2,20),(3,2,2,10) 

は、その後、あなたは次のようにユニークな列を取得する必要があります私の場合、私は作成されたテーブルをドロップします:

DROP TABLE Flight 
DROP TABLE Class 
DROP TABLE FlightCapacity 
関連する問題