【问题标题】:Having an issue with the last part of my Oracle SQL query我的 Oracle SQL 查询的最后一部分有问题
【发布时间】:2016-10-01 22:15:26
【问题描述】:

我遇到了问题(是的,这是家庭作业)。问题是:

  1. 编写一个SELECT 语句,为每个具有这些列的订单的客户返回一行:

Customers 表中的 email_address

订单数量统计

每个订单的总金额(提示:首先,从价格中减去折扣金额。然后,乘以数量。)

仅返回客户有超过 1 个订单的行。 按行项目金额的总和对结果集进行降序排序。 我对这部分的查询有效。它是:

SELECT email_address, COUNT(o.order_id) as number_of_orders, sum((item_price-discount_amount)*quantity) As Total
FROM Customers c JOIN Orders o
ON c.customer_id = o.customer_id
JOIN order_items oi on oi.order_id =o.order_id
GROUP BY email_address
HAVING COUNT (o.order_id) > 1
ORDER BY number_of_orders DESC;`

在那之后,我应该修改那个查询,使它只计算和总计 item_price 值大于 400 的行项目。我似乎无法弄清楚。有人可以指出我正确的方向吗?

顺便说一句,这是我的吉他商店数据库。

【问题讨论】:

  • 你的意思是where oi.item_price > 400?您是否只应该包括具有多个订单匹配的客户?还是仍然是所有客户都有不止一个订单,但仅将这些项目包括在总数中?
  • 所有有多个订单的客户,但仅限 item_price 大于 400 的商品。
  • 你学过案例表达式吗?哪个可以进入sum(),继续问题中的提示主题...
  • 我有,但是在这个特定的课程中,我们还没有。我们只应该为此分配使用聚合函数和子查询。

标签: sql oracle


【解决方案1】:

假设 item_price 是 order_items 表的一部分,您必须为大于 400 的 item_price 添加过滤器。

SELECT email_address, COUNT(o.order_id) as number_of_orders, sum((item_price-discount_amount)*quantity) As Total
FROM Customers c JOIN Orders o
ON c.customer_id = o.customer_id
JOIN order_items oi on oi.order_id =o.order_id
where oi.item_price > 400
GROUP BY email_address
HAVING COUNT (o.order_id) > 1
ORDER BY number_of_orders DESC;

【讨论】:

    【解决方案2】:
    SELECT email_address, COUNT(o.order_id) as number_of_orders, sum((item_price-discount_amount)*quantity) As Total
    FROM Customers c JOIN Orders o
    ON c.customer_id = o.customer_id
    JOIN (
        SELECT order_id, 
            CASE WHEN item_price < 400 THEN 0 ELSE item_price END,
            --other columns you need
        FROM order_items ) oi on oi.order_id =o.order_id
    GROUP BY email_address
    HAVING COUNT (o.order_id) > 1
    ORDER BY number_of_orders DESC;
    

    这应该可行。

    此外,在寻址列时,您应该始终使用表别名——即使没有名称冲突。它提高了可读性并防止您犯下严重的错误。

    【讨论】:

      猜你喜欢
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2023-03-28
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多