【问题标题】:GROUP BY clause with logical functions具有逻辑功能的 GROUP BY 子句
【发布时间】:2014-11-23 06:55:33
【问题描述】:

我正在使用 Oracle 11g Application Express,并在 SQL Plus CLI 中执行这些命令。这是上课的,我无法解决这个问题。我不知道如何在订单上添加商品的总数量 - 我很困惑,因为我不知道如何获取每个订单的 QUANTITY 总和(客户有多个订单)。

对于每个有订单的客户,列出客户编号,订单数量 该客户拥有,这些订单上的商品总数量,以及总价格 这几项。按客户编号订购输出。 (提示:您必须使用 GROUP BY 此查询中的子句)。

表格(我们将使用):
客户:包含客户编号
ORDERS:包含 order_num、customer_num
项目:包含 order_num、数量、total_price

我的逻辑:我需要能够计算每个客户每个订单号的数量总和。我已经在这里坐了一个多小时,无法弄清楚。

到目前为止,这是我可以制定的..

SELECT customer_num, count(customer_num) FROM orders GROUP BY customer_num;

我不太了解如何进行 GROUP BY(是的,我已经用谷歌搜索并研究了一段时间,但它只是没有点击),我不知道如何获取每个 QUANTITY 的总和每个客户的订单。

不是找人帮我做我的工作,只是一些指导 - 谢谢!

【问题讨论】:

  • 通过customer_num 分组,您的方向是正确的。但是根据分配,您需要按订单和客户进行分组。你试过GROUP BY customer_num, order_num之类的吗?
  • 嗯,我的看法——如果我按customer_num, order_num 分组,那么它将显示每个order_num,并且当我这样做时,每个count(customer_num) 都只有1。分配调用customer_num 和客户拥有的订单数量,因此sum(customer_num) - 对于 ORDERS 表中的每个 customer_num 条目,都有一个订单。我只需要知道每个客户有多少订单,然后从中得出其他金额。
  • 一次一步。如果您需要获取每个客户每个订单的数量总和,您需要以某种方式按customer_numorder_num 分组,对吗?
  • 下一步是您不需要客户数量,您需要订单中数量的总和。所以像SUM(quantity).
  • 我必须拥有count(customer_num),因为 ORDERS 表中的每个 customer_num 条目(甚至是重复的条目)都代表一个 ORDER。例如,客户 104 订购了一些东西,然后在不同的日期下了另一个订单 - customer_num 104 将多次出现在 ORDERS 中,因此构成多个订单 - 我必须知道每个客户的订单数量。我试过SUM(quantity) - 它把我所有的号码都扔掉了。

标签: sql oracle oracle11g oracle-apex


【解决方案1】:
select o.customer_num,
       count(distinct o.order_num) as num_orders,
       sum(i.quantity) as total_qty,
       sum(i.total_price) as total_price
  from orders o
  join items i
    on o.order_num = i.order_num
 group by o.customer_num
 order by o.customer_num

第一件事: 您必须连接解决问题所必需的两个表(订单和项目)。相关字段似乎是 order_num

第二件事: 您的 group by 子句很好,您希望每个客户一行。但是由于连接到 items 表,您将不得不计算 DISTINCT 订单(因为订单和项目之间可能存在一对多的关系)。否则,具有 2 个不同关联项目的订单将被计算两次。

接下来,将数量和总价相加,您现在可以执行此操作,因为您已加入所需的表。

【讨论】:

  • 非常感谢 - 这对我来说是我所需要的。我让它变得比必要的复杂 - 我认为我必须添加每个客户的每个订单数量的总和,这让我的大脑绞尽脑汁。感谢您的帮助!
【解决方案2】:

这也可以使用WHERE解决:

SELECT orders.customer_num,                               /*customer number*/
       COUNT(DISTINCT orders.order_num) AS "num_orders", /*number of orders/c*/
       SUM(items.quantity) as "total_qty",               /*total quantity/c*/
       SUM(items.total_price) as "total_price"           /*total price/items*/

/* For each customer having an order, list the customer number,
the number of orders that customer has, the total quantity of items
on those orders, and the total price for the items.
Order the output by customer number.
(Hint: You must use a GROUP BY clause in this query). */

FROM orders, items
    WHERE orders.order_num = items.order_num

GROUP BY orders.customer_num
 ORDER BY orders.customer_num
;

【讨论】:

    猜你喜欢
    • 2017-01-16
    • 2011-01-12
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多