【问题标题】:Calculating average price of items purchased by customers计算客户购买商品的平均价格
【发布时间】:2018-08-11 20:43:36
【问题描述】:

我有三个表:客户、订单和订单项。它们的设置如下:

CREATE TABLE cust_account(
cust_id DECIMAL(10) NOT NULL,
first VARCHAR(30),
last VARCHAR(30),
address VARCHAR(50),
PRIMARY KEY (cust_id));

CREATE TABLE orders(
order_num DECIMAL(10) NOT NULL,
cust_id DECIMAL(10) NOT NULL,
order_date DATE,
PRIMARY KEY (order_num));

CREATE TABLE lines(
order_num DECIMAL(10) NOT NULL,
line_id DECIMAL(10) NOT NULL,
item_num DECIMAL(10) NOT NULL,
price DECIMAL(10),
PRIMARY KEY (order_id, line_id),
FOREIGN KEY (item_id) REFERENCES products);

使用 Oracle,我需要编写一个查询,显示购买超过 5 次或更多的客户的平均商品价格。这是我一直在使用的:

SELECT DISTINCT cust_account.cust_id,cust_account.first, cust_account.last, lines.AVG(price) AS average_price
FROM cust_account
 JOIN orders
 ON cust_account.cust_id = orders.cust_id
 JOIN lines
 ON lines.order_num = orders.order_num
 WHERE lines.item_num IN (SELECT lines.item_num
    FROM lines
    JOIN orders
    ON lines.order_num = orders.order_num
        GROUP BY lines.order_num
        HAVING COUNT(DISTINCT orders.cust_id) >= 5
    );

【问题讨论】:

  • 5 or more purchases 如果客户有 1 个包含 5 件商品的订单 - 是否计算在内?还是应该有 5 个订单?
  • 您能提供一些示例数据并期待结果吗?

标签: sql oracle join subquery where


【解决方案1】:
  1. ...INNER JOIN你所有的桌子在一起
  2. ...GROUP BY客户并计算每个客户线路的平均价格
  3. ...使用HAVING 子句将结果限制为购买次数为 5 次或以上的组

因为这闻起来像家庭作业,所以我会在长时间的停顿后发布完整的答案......

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.


SELECT   ca.first, ca.last, avg(l.price) avg_price
FROM     cust_account ca
INNER JOIN orders o ON o.cust_id = ca.cust_id
INNER JOIN lines l ON l.order_num = o.order_number
GROUP BY ca.first, ca.last
HAVING COUNT(distinct l.line_id) >=5
-- OR, maybe your requirement is ...
-- HAVING COUNT(distinct o.order_num) >= 5
-- ... the question was a bit unclear on this point

【讨论】:

  • 我喜欢你的“长时间停顿”方法。我应该这样做的:(
【解决方案2】:

我想就是这样。我认为它不会立即起作用(我对 oracle 一无所知),但我想你会明白的:

SELECT orders.cust_id,
       AVG(lines.price) AS average_price
FROM lines
JOIN orders ON orders.order_num = orders.order_num
WHERE orders.cust_id IN (SELECT orders.cust_id
                         FROM orders
                         GROUP BY orders.cust_id
                         HAVING COUNT(*) >= 5)
GROUP BY orders.cust_id;

子查询选择订单超过 5 个的客户。 主查询只是从该客户的所有订单中获取所有行。

我猜你可以通过使用HAVING DISTINCT ... 来消除子查询。无论如何,带有子查询的应该可以正常工作。

更新。

类似的东西

SELECT orders.cust_id,
       AVG(lines.price) AS average_price
JOIN orders ON orders.order_num = orders.order_num
GROUP BY orders.cust_id
HAVING COUNT(DISTINCT orders.id) >= 5;

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2011-06-08
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多