我在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
如何调整这些收款人并产生PaymentID
,PrimaryPayee
和SubPayee
的输出?谢谢你的帮助。
===编辑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行。
答案 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