我在另一篇文章中提到了这个问题但是我已经改变了。 我有三张桌子:
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 ---
答案 0 :(得分: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('+@cols+')
) AS pvt'
EXECUTE(@query)
然后在我的情况下,我将删除创建的表:
DROP TABLE Flight
DROP TABLE Class
DROP TABLE FlightCapacity