SQL; 求和2个字段,然后将它们一起添加

Dam*_*ran 5 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 
       |    |                          |                           |
Run Code Online (Sandbox Code Playgroud)

我到目前为止的代码是

 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
Run Code Online (Sandbox Code Playgroud)

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

我希望你们明白我要做的事情.我在这里先向您的帮助表示感谢!:)

Stu*_*tLC 3

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

编辑

只是为了澄清民主党的评论,GROUP BY不允许指定别名,因此上面的查询“重复” 和SELECT中的总和HAVING。这可以通过嵌套消除,但请注意 是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;
Run Code Online (Sandbox Code Playgroud)

而且,如果您愿意,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;
Run Code Online (Sandbox Code Playgroud)

  • +1:我更喜欢的另一种选择*(因为它遵循“不要重复自己”原则)*是将查询包装在外部查询“SELECT * FROM (theQuery) WHERE a+b > c”中,以便以避免两次写出“a”和“b”的计算。*[也没有真正可测量的性能差异。]* (2认同)