在单行中获取数据

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)

请建议我怎样才能实现这个目标.

Lam*_*mak 5

另一种方法:

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)