mysql - SQL交叉表查询查看一些交易的总和

标签 mysql sql

我有一个包含汇款交易的 SQL 数据库表。我有 4 列:TransferID、付款人、收款人、金额

假设这是我的数据库表:

DatabaseTable
(来源:pbrd.co)

我可以创建一个交叉表查询来查看每个人向他的每个好友发送了多少钱。结果将类似于这样:

ResultOfCrosstabQuery
(来源:pbrd.co)

但是我想看到的是每两个人之间的交易平衡。例如,如果 Peter 向 John 发送了 13 美元,John 向 Peter 发送了 2 美元,那么我希望看到 11 美元(和 $-11)作为他们交易的汇总结果,而不是 13 美元和 2 美元。结果应该是这样的:
ResultTable
(来源:pbrd.co)

什么查询可以解决这个问题?

最佳答案

如上所述,动态、枢轴 crosstab query使用 TRANSFORM 子句是一种独特的 MS Access SQL 方法,在其他 RDMS 中不可用。由于 OP 已将 MySQL 后端表链接到 MS Access 前端应用程序,因此可以对 MySQL 数据运行前端交叉表查询。

对于特定需求,请考虑连接匹配的PayerPayee的聚合查询的源查询。然后对源查询运行交叉表:

来源查询

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/

相关文章:

mysql - 用于 ubuntu 14.04 的一个文件中的 ansible mysql 配置

c# - 根据单选按钮选择将表单信息提交到数据库

mysql - MYSQL中如何计算百分比?

java - 如何在 PreparedStatement 中使用多个可选参数填充查询 sql?

java - android studio sqlite方法错误

php - 如何安全地处理进出数据库的文本区域数据?

mysql - 与他人保持特定距离进入

c# - Linq 查询无法合并两个表记录

java - 使用Java从MySQL中检索图片

sql - 为每个 "Group"选择最新文档