2012-02-27 18 views
2

我在另一個帖子中問過這個問題,但我已經改變了。 我有三個表:如何顯示查詢結果columnar(在不同的列中)而不是逐行顯示?

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 

但我想下面的結果:(我想顯示在一個單列每次飛行和能力的所有類,但在不同的列)

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

回答

2

也許是這樣的:

首先是一些測試數據:

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) 

然後你必須得到獨特的列是這樣的:

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:

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) 

然後在我的情況下,我會刪除創建的表格:

DROP TABLE Flight 
DROP TABLE Class 
DROP TABLE FlightCapacity