多个表上的 SQL 求和函数和计数函数会产生相乘的值

标签 sql

在无数次尝试把自己逼疯之后,我求助于你,希望有人愿意帮助我....

我有 4 个表:SO (ServiceOrder)、PR (PreRecording)、IH (InvoiceHeader) 和 IL (InvoiceLine),列和行如下所示:

SO(服务订单):

<表类="s-表"> <头> SO.No_ <正文> SO2101234 SO2101235 SO2101237 SO2101239

公关(预录制):

<表类="s-表"> <头> PR.No_ 公关专线 PR.金额 <正文> SO2101234 1 50 SO2101234 2 18 SO2101239 1 110 SO2101239 2 40 SO2101239 3 40

IH(发票抬头):

<表类="s-表"> <头> IH.No_ IH.SO <正文> VF2134889 SO2101234 VF2134890 SO2101235 VF2134891 SO2101239 VF2134892 SO2101234 VF2134893 SO2101239

IL(发票行):

<表类="s-表"> <头> IL.DocNo_ IL.LineNo IL.LineAmount <正文> VF2134889 1 55 VF2134889 2 23 VF2134890 1 12 VF2134890 2 34 VF2134890 3 87 VF2134891 1 114 VF2134892 1 53 VF2134892 2 25 VF2134892 3 17 VF2134892 4 15 VF2134893 1 43 VF2134893 2 38

关系:

  • PR.No_ = SO.No_
  • IH.SO = SO.No_
  • IL.DocNo_ = IH.No_

期望的结果:

<表类="s-表"> <头> SO.No_ PR.SumAmount IH.SumAmount <正文> SO2101234 68 188 SO2101235 0 133 SO2101237 0 0 SO2101239 190 195

用我通常的简单内部/外部/连接我没有成功,很明显有些 SELECT的应该是嵌套的。用一个简单的查询来组合SOPR , 我没有问题。用一个简单的查询来组合SOIH , 我没有问题。但是,当我尝试设置一个查询以在一个输出中获取所有这些内容时,由于在多个表中使用/找到的行,它变得困惑并且值开始成倍增加。

提前致谢....

最佳答案

您可以简单地嵌套您的查询,以便执行外部 SELECT来自平坦的内部SELECT .如果您的 RDBMS 版本不支持 WITH,这也适用CTE。

保留 NULL 的行值,我使用了LEFT JOINS还有 COALESCE 函数获取0作为结果而不是 NULL ,正如您想要的结果。

   SELECT PRGRP.No_, 
          COALESCE(PRGRP.SumAmount, 0) AS PRAmount,
          COALESCE(SUM(IL.LineAmount), 0) AS ILAmount
     FROM (   SELECT SO.No_, SUM(PR.Amount) AS SumAmount
                FROM ServiceOrder SO 
           LEFT JOIN PreRecording PR 
                  ON PR.No_ = SO.No_
            GROUP BY SO.No_
          ) PRGRP
LEFT JOIN InvoiceHeader IH 
       ON IH.SO = PRGRP.No_
LEFT JOIN InvoiceLine IL 
       ON IL.DocNo_ = IH.No_
 GROUP BY PRGRP.No_

结果:

<表类="s-表"> <头> 没有_ PR金额 ILAmount <正文> SO2101234 68 188 SO2101235 0 133 SO2101237 0 0 SO2101239 190 195

Full MySQL example in this db<>fiddle .

关于多个表上的 SQL 求和函数和计数函数会产生相乘的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69831758/

相关文章:

sql - 分组并计算每个不同值的百分比

php - 如何防止 PHP 中的 SQL 注入(inject)?

sql server存储过程更新记录

mysql - 找不到丢失的别名 : every derived table must have its own alias

mysql - 如何在单词的SQL数据库中查询短语?

sql - 合并更新查询未按预期执行的问题

mysql - 如何修复 SQL 连接中的重复数据?

sql - 无法在 Postgres 中连接两个有限制的表

MySQL 5.6 - 类似 DENSE_RANK 的功能,没有 Order By

sql - 如何将列变成行条件