Ask*_*ans 1 sql sql-server sql-server-2008
我有两个表PackageDetail和PackageDuration PackageDuration将PackageID作为外键,即可以有多个关于PackageID的记录
PackageDetail的架构是:
PackageID INT PK
PackageName Nvarchar(50)
Run Code Online (Sandbox Code Playgroud)
PackageDuration表的模式是:
DurationID INT PK
Price Money
Duration Nvarchar(50)
PackageID INT FPK
Run Code Online (Sandbox Code Playgroud)
PackageDetail表有以下记录:
PackageID PackageName
1 TestPackage
2 MySecondPackage
Run Code Online (Sandbox Code Playgroud)
PackageDuration表有以下记录:
DurationID PackageID Price Duration
1 1 100 6
2 1 200 12
3 1 300 24
4 2 500 6
Run Code Online (Sandbox Code Playgroud)
PackageDuration表可以有最多3条记录,其中一个PackageID不超过此值(如果忽略了)现在我想按以下方式选择记录:
PackageId PackageNAme Price1 Price2 Price3 Duration1 Duration2 Duration3
1 TestPackage 100 200 300 6 12 24
2 MySecondPackage 500 null null 6 null null
Run Code Online (Sandbox Code Playgroud)
请建议我怎样才能实现这个目标.
另一种方法:
WITH Durations AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY PackageId ORDER BY DurationId) Sequence
FROM PackageDuration
)
SELECT A.PackageId, B.PackageName,
MIN(CASE WHEN Sequence = 1 THEN Price ELSE NULL END) Price1,
MIN(CASE WHEN Sequence = 2 THEN Price ELSE NULL END) Price2,
MIN(CASE WHEN Sequence = 3 THEN Price ELSE NULL END) Price3,
MIN(CASE WHEN Sequence = 1 THEN Duration ELSE NULL END) Duration1,
MIN(CASE WHEN Sequence = 2 THEN Duration ELSE NULL END) Duration2,
MIN(CASE WHEN Sequence = 3 THEN Duration ELSE NULL END) Duration3
FROM Durations A
INNER JOIN PackageDetail B
ON A.PackageId = B.PackageId
GROUP BY A.PackageId, B.PackageName
Run Code Online (Sandbox Code Playgroud)