我有一个包含汇款交易的 SQL 数据库表。我有 4 列:TransferID、付款人、收款人、金额
假设这是我的数据库表:
(来源:pbrd.co)
我可以创建一个交叉表查询来查看每个人向他的每个好友发送了多少钱。结果将类似于这样:
(来源:pbrd.co)
但是我想看到的是每两个人之间的交易平衡。例如,如果 Peter 向 John 发送了 13 美元,John 向 Peter 发送了 2 美元,那么我希望看到 11 美元(和 $-11)作为他们交易的汇总结果,而不是 13 美元和 2 美元。结果应该是这样的:
(来源:pbrd.co)
什么查询可以解决这个问题?
最佳答案
如上所述,动态、枢轴 crosstab query使用 TRANSFORM
子句是一种独特的 MS Access SQL 方法,在其他 RDMS 中不可用。由于 OP 已将 MySQL 后端表链接到 MS Access 前端应用程序,因此可以对 MySQL 数据运行前端交叉表查询。
对于特定需求,请考虑连接匹配的Payer和Payee的聚合查询的源查询。然后对源查询运行交叉表:
来源查询
SELECT m1.Payer, m1.Payee, (m1.SumAmount - m2.SumAmount) As NetTransfer
FROM
(SELECT t.Payer, t.Payee, Sum(t.Amount) AS SumAmount
FROM Transfers t
GROUP BY t.Payer, t.Payee) m1
INNER JOIN
(SELECT t.Payer, t.Payee, Sum(t.Amount) AS SumAmount
FROM Transfers t
GROUP BY t.Payer, t.Payee) m2
ON m1.Payer = m2.Payee AND m1.Payee = m2.Payer
-- Payer Payee NetTransfer
-- John Fred 2
-- Fred John -2
-- Peter John 11
-- John Peter -11
交叉表查询 (语法仅在 MS Access 中有效):
TRANSFORM Sum(q.NetTransfer) AS SumOfNetTransfer
SELECT q.Payer
FROM SourceQueryQ q
GROUP BY q.Payer
PIVOT q.Payee;
-- Payer Fred John Peter
-- Fred -2
-- John 2 -11
-- Peter 11
<小时/>
当然,第一个查询也可以作为派生表嵌套在交叉表中:
组合查询
TRANSFORM Sum(q.NetTransfer) AS SumOfNetTransfer
SELECT q.Payer
FROM
(SELECT m1.Payer, m1.Payee, (m1.SumAmount - m2.SumAmount) As NetTransfer
FROM
(SELECT t.Payer, t.Payee, Sum(t.Amount) AS SumAmount
FROM Transfers t
GROUP BY t.Payer, t.Payee) m1
INNER JOIN
(SELECT t.Payer, t.Payee, Sum(t.Amount) AS SumAmount
FROM Transfers t
GROUP BY t.Payer, t.Payee) m2
ON m1.Payer = m2.Payee AND m1.Payee = m2.Payer) q
GROUP BY q.Payer
PIVOT q.Payee;
注意:与任何 Access 查询一样,交叉表限制为 255 列,因此如果数据包含超过 254 个不同的付款人/收款人,请使用 PIVOT...IN
子句定义列:
PIVOT q.Payee IN ('Fred', 'John', 'Peter')
关于mysql - SQL交叉表查询查看一些交易的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41407816/