如何在T-SQL中的位字段上转移此数据?

时间:2015-05-05 13:10:15

标签: sql-server sql-server-2008 tsql

我在SQL Server 2008中工作,并且有一个带有位字段的统一表,以指示某人是否是"收款人"或者" 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

我已经在网上查看了几个数据透视示例,并且无法解决这个问题。我对子查询的原始查询看起来像这样。

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的输出?谢谢你的帮助。

===编辑2015年5月5日上午8:28 ===

谢谢标签。所以我以这种方式调整了查询​​,这似乎更接近标记,但我在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

FROM中的子查询产生此输出。

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

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

1 个答案:

答案 0 :(得分:3)

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

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