数据库;求和 2 个字段,然后将它们相加

标签 sql database oracle sum

刚开始实习并负责一些 SQL。发现它有点棘手。感谢任何帮助。谢谢!

任务:

“是否可以为以下内容编写警报。显示所有在下个月到期的未结销售订单与未结销售发票合并(添加)时超过信用额度的客户。”

我建议的逻辑:

  1. 首先,我要做的是对每个客户(在 SALES 表中)下个月的所有销售订单求和。

  2. 接下来,对每个客户的所有未结发票求和,即计算出每个客户欠的总金额(在 INVOICES 表中)。

  3. 然后我想通过相应的 customer_id 将 1 和 2 的结果相加

  4. 接下来比较上面3的计算是否大于每个客户的信用额度。

如果 3 中的总计超过信用额度,则只有这些公司应该显示在生成的表格中。结果表的理想格式是

Cust_ID|Name|Sum_sales_orders (1.above)|Sum_open_invoices (2.above)| Total_orders&invoices
----------------------------------------------------------------------------
   1   |  A |  25000                   |  333                      | 25333 
       |    |                          |                           |

我目前的代码是

 SELECT arc.company, arc.credit_limit, 
     sum (ard.unit_price * ard.invoice_qty) as open_invoice_total, 
     sum (od.total_qty_ord * od.unit_price) as open_orders_total
 FROM iqms.arprepost_detail ard, iqms.arprepost arp, iqms.arcusto arc, iqms.ord_detail od, iqms.orders o
 WHERE ard.arprepost_id = arp.id 
     and arc.id = o.arcusto_id and o.id = od.orders_id
     and arp.arcusto_id = arc.id
  GROUP BY arc.company, arc.credit_limit

我认为这是在 sum () 函数中计算正确的总数?还是我错了?如何添加 open_invoice_total 和 open_orders_total?然后将它们与 credit_limit 进行比较?

我希望你们明白我想做什么。我在这里先向您的帮助表示感谢! :)

最佳答案

您可以使用 HAVING子句检查总和是否超过信用额度,像这样。为了便于阅读,我还将 WHERE 子句中的连接替换为 INNER JOINS。

 SELECT arc.company, arc.credit_limit, 
       sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
       sum(od.total_qty_ord * od.unit_price) as open_orders_total
 FROM iqms.arprepost_detail ard 
        INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id
        INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id
        INNER JOIN iqms.ord_detail od ON o.id = od.orders_id
        INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
  GROUP BY arc.company, arc.credit_limit
  HAVING sum(ard.unit_price * ard.invoice_qty) + sum(od.total_qty_ord * od.unit_price) > arc.credit_limit;

编辑

只是为了澄清民主党的评论,GROUP BY 不允许指定 aliases ,因此上面的查询“重复”了 SELECTHAVING 中的总和。这可以通过嵌套来消除,但请注意 HAVING 是用 WHERE 切换的。所以查询的 DRYer 版本是:

SELECT company, credit_limit, open_invoice_total, open_orders_total
FROM
(
     SELECT arc.company, arc.credit_limit, 
           sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
           sum(od.total_qty_ord * od.unit_price) as open_orders_total
     FROM iqms.arprepost_detail ard 
            INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id
            INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id
            INNER JOIN iqms.ord_detail od ON o.id = od.orders_id
            INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
      GROUP BY arc.company, arc.credit_limit
) AS nested
WHERE (open_invoice_total + open_orders_total) > arc.credit_limit;

而且,如果您愿意,CTE 可能会使其更具可读性:

;WITH nested AS
(
     SELECT arc.company, arc.credit_limit, 
           sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
           sum(od.total_qty_ord * od.unit_price) as open_orders_total
     FROM iqms.arprepost_detail ard 
            INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id
            INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id
            INNER JOIN iqms.ord_detail od ON o.id = od.orders_id
            INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
      GROUP BY arc.company, arc.credit_limit
)
SELECT company, credit_limit, open_invoice_total, open_orders_total
  FROM nested
  WHERE (open_invoice_total + open_orders_total) > arc.credit_limit;

关于数据库;求和 2 个字段,然后将它们相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13527950/

相关文章:

php - 比较不同表中两列的 SUM()?

尝试使用 mysqli_connect() 连接到数据库时,PHP 查找数据库时出错

oracle - plsql累积乘法

c# - 具有 Oracle 托管驱动程序将 NUMBER(10) 映射到 long 的 Entity Framework 不起作用

mysql - 如何使用字段的最大值编写更新查询?

mysql - sql group by - 诅咒与祝福

mysql - 如何进行 MySQL 查询以向前和向后搜索术语?

mysql - 在数据库中设置选定行的最佳实践

用于交叉链接表和外键使用的 Sqlite 设计

c++ - Oracle OCI、绑定(bind)变量和查询,如 ID IN (1, 2, 3)