如何在t-sql中的位字段上旋转这些数据



我在SQL Server 2008中工作,并有一个带有位字段的Unity表,以指示一个人是"收款人"还是" subpayee"。我需要将这些数据加入另一个返回付款信息的查询,而我获得所需输出的唯一方法是将两个子查询应用于Select语句。目前,我正在处理少量数据,但预计次级表(PaymentPayee)将是巨大的。所以我想提前使这个高效。

我的想法是在加入该数据之前将数据旋转到表变量中,然后只需从我的表变量加入PaymentID

这是我现在正在与之合作的子查询,我想枢转。

SELECT  pp.PaymentID,
        p.PayableTo,
        pp.IsSubPayee
FROM    Payee p
        INNER JOIN PaymentPayee pp ON p.PayeeID = pp.PayeeID

这会产生以下输出:

PaymentID   PayableTo      IsSubPayee
1001        Bill Jones     0
1001        John Smith     1
1002        John Smith     0
1002        Jim Thorson    1

我想将上述旋转为以下内容:

PaymentID   PrimaryPayee   SubPayee
1001        Bill Jones     John Smith
1002        John Smith     Jim Thorson

我在网上查看了几个枢轴示例,但无法弄清楚这个示例。我与子Queries的最初查询看起来像这样。

SELECT  p.*,
        p1.PayableTo AS PrimaryPayee,
        p2.PayableTo AS SubPayee
FROM    dbo.Payment p
        INNER JOIN dbo.PaymentDetail pd ON p.PaymentID = pd.PaymentID
        INNER JOIN dbo.Loan l ON p.LoanID = l.LoanID
        LEFT JOIN (
            SELECT  Payee.PayableTo,
                    pp.PaymentID
            FROM    dbo.Payee
                    INNER JOIN dbo.PaymentPayee pp ON Payee.PayeeID = pp.PayeeID
            WHERE   (pp.IsSubPayee = 0)
            ) p1 ON p.PaymentID = p1.PaymentID
        LEFT JOIN (
            SELECT  Payee.PayableTo,
                    pp.PaymentID
            FROM    dbo.Payee
                    INNER JOIN dbo.PaymentPayee pp ON Payee.PayeeID = pp.PayeeID
            WHERE   (pp.IsSubPayee = 1)
            ) p2 ON p.PaymentID = p2.PaymentID

这是我最初旋转数据的尝试,但我意识到这是错误的。

SELECT  PaymentID, PayableTo, IsSubPayee
FROM    (
        SELECT  pp.PaymentID,
                p.PayableTo,
                pp.IsSubPayee
        FROM    Payee p
                INNER JOIN PaymentPayee pp ON p.PayeeID = pp.PayeeID
        ) x
PIVOT   (
        MAX(PaymentID)
        FOR IsSubPayee IN (0, 1)
        ) piv

如何使这些收款人旋转并产生PaymentIDPrimaryPayeeSubPayee的输出?感谢您的帮助。

===编辑5/5/2015 at 8:28 AM ===

谢谢标签。因此,我以这种方式调整了查询,这似乎更接近标记,但是我很难在Pivot语句中的查询遇到问题。这是我拥有的。

SELECT  PaymentID, PrimaryPayee, SubPayee
FROM    (
        SELECT  pp.PaymentID,
                CASE WHEN pp.IsSubPayee = 0 THEN p.PayableTo ELSE NULL END PrimaryPayee,
                CASE WHEN pp.IsSubPayee = 1 THEN p.PayableTo ELSE NULL END SubPayee
        FROM    Payee p
                INNER JOIN PaymentPayee pp ON p.PayeeID = pp.PayeeID
        ) x
PIVOT   (
        MAX(PaymentID) AS PaymentID
        FOR IsSubPayee IN (0, 1)
        ) piv

从发出中的该子查询产生此输出。

PaymentID    PrimaryPayee    SubPayee
1001         Bill Jones      NULL
1001         NULL            John Smith
1002         John Smith      NULL
1002         NULL            Jim Thorson

现在我只需要将这些结果折叠成2行。

您可以使用有条件的聚合获得所需的结果:

SELECT PaymentID,
       MAX(CASE WHEN IsSubPayee = 0 THEN PayableTo END) AS PrimaryPayee,
       MAX(CASE WHEN IsSubPayee = 1 THEN PayableTo END) AS SubPayee
FROM (SELECT  pp.PaymentID, p.PayableTo, pp.IsSubPayee
      FROM Payee p
      INNER JOIN PaymentPayee pp ON p.PayeeID = pp.PayeeID) t
GROUP BY PaymentID

如果您想使用PIVOT,则使用以下查询:

SELECT PaymentID, [0] AS PrimaryPayee, [1] AS SubPayee
FROM 
   (SELECT  pp.PaymentID, p.PayableTo, pp.IsSubPayee
    FROM Payee p
    INNER JOIN PaymentPayee pp ON p.PayeeID = pp.PayeeID) p
PIVOT
(
   MAX (PayableTo)
   FOR IsSubPayee IN ( [0], [1] )
) AS pvt

最新更新