我在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
如何使这些收款人旋转并产生PaymentID
,PrimaryPayee
和SubPayee
的输出?感谢您的帮助。
===编辑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