【问题标题】:How to show total cost across all orders per customer? (subquery)如何显示每位客户所有订单的总成本? (子查询)
【发布时间】:2020-10-31 02:37:49
【问题描述】:

我想显示他们订单的总成本,并显示他们购买的每件商品。当我按订单号排序时,总和(价格)就搞砸了。当我按客户名称排序时,它只显示一种产品。我如何显示他们购买的所有产品以及这些产品的总成本。 *每个订单都附有一件产品。具有唯一的订单号

这些是我创建的虚构表格,与我自己的非常相似。

Customer Table
+------+-------------+
| name | customer_id |
+------+-------------+
| Adam |           4 |
| Drew |           6 |
| Tom  |           8 |
+------+-------------+
Order Table
+---------------+---------------+----------+--------------+
| purchase_date | delivery_date | order_id | customer_id  |
+---------------+---------------+----------+--------------+
| 01/22/2020    | 02/23/2020    |        3 |             4|
| 01/12/2020    | 02/12/2020    |        5 |             4|
| 01/31/2020    | 02/22/2020    |        6 |             4|
| 01/05/2020    | 02/14/2020    |       11 |             8|
| 01/22/2020    | 02/23/2020    |        7 |             8|
| 01/12/2020    | 02/12/2020    |        8 |             6|
| 01/31/2020    | 02/22/2020    |        9 |             6|
| 01/05/2020    | 02/14/2020    |       10 |             6|
| 01/05/2020    | 02/14/2020    |       10 |             6|
+---------------+---------------+----------+--------------+
Product_order table
+-------+------------+----------+
| po_id | product_id | order_id |
+-------+------------+----------+
|     1 |          3 |         3|
|     2 |         13 |         5|
|     3 |          7 |         6|
|     4 |          8 |        11|
|     5 |         45 |         7|
|     6 |          9 |         8|
|     7 |          3 |         9|
|     8 |         45 |        10|
|     9 |          3 |        10|
+-------+------------+----------+
product table
+------------+------------+-------+
| product_id |  product   | Price |
+------------+------------+-------+
|          3 | Soda       | 7.00  |
|         13 | Chips      | 9.00  |
|          7 | GummyBears | 11.00 |
|          8 | IceCream   | 3.00  |
|          9 | Pen        | 2.00  |
|         45 | Gum        | 1.00  |
+------------+------------+-------+

这是我尝试过的查询,但产生了以下结果。

select c.name, product, sum(p.price) as total_sale
from (Select distinct order_id, customer_id
    from `order`) as o
inner join (select o.customer_id
    from `order` o
    group by o.customer_id) as a on o.customer_id = a.customer_id
inner join product_order po on o.order_id = po.order_id
inner join customer c on o.customer_id = c.customer_id
inner join products p on po.product_id = p.product_id
group by c.name

这是结果:

+----------+------------+-----------------+
|   Name   |  product   | total_purchased |
+----------+------------+-----------------+
| Adam     | Soda       |            27.00|
| Tom      | IceCream   |             4.00|
| Drew     | Pen        |            17.00|
+----------+------------+-----------------+

我想展示他们购买的所有产品。以及他们购买所有物品的总金额,就像这样。

+------+------------+-----------------+
| Name |  product   | total_purchased |
+------+------------+-----------------+
| Adam | Soda       |            27.00|
| Adam | Chips      |            27.00|
| Adam | GummyBears |            27.00|
| Tom  | IceCream   |             4.00|
| Tom  | Gum        |             4.00|
| Drew | Pen        |            17.00|
| Drew | Soda       |            17.00|
| Drew | Gum        |            17.00|
| Drew | Soda       |            17.00|
+------+------------+-----------------+

【问题讨论】:

  • 能否也给我们完整的数据产生你的结果,你基本上必须在加入之前有底价然后删除分组。
  • @nbk 为了清楚起见,我添加了表格。
  • 我不明白。亚当只有一份订单和一种产品(GummyBears)。他是如何在结果集中得到 3 种产品的?
  • @Ryan 真的不想挑剔,但是您在表格中列出的数据与您希望的结果集不匹配(即:产品 IceCreamPen不存在于您的表中)。为了使它更容易,您可以在 db-fiddle.com 或 sql-fiddle.com 上模拟您的表(带有数据)和查询,以便我们有一个您所看到的工作示例?在其中一个站点上模拟您的数据将使其他人更容易帮助您获得问题的答案。这是一个如何模拟它的示例db-fiddle.com/f/wbNZfuvnVEeT5ceQ9QZrYK/0
  • @GharbadTheWeak 我在表格中添加了更多数据。

标签: mysql


【解决方案1】:

数据不符合想要的结果,但这只是一个小问题

order是mysql中的保留字,请尽量不要使用

您示例中的日期也不是 mysql 标准,所以我不得不重写它们

正如我所说,您必须在将总和加入 colplte 查询之前计算总和

CREATE TABLE Customer  (
  `name` VARCHAR(4),
  `customer_id` INTEGER
);

INSERT INTO Customer 
  (`name`, `customer_id`)
VALUES
  ('Adam', '4'),
  ('Drew', '6'),
  ('Tom', '8');
CREATE TABLE `Order`  (
  `purchase_date` DATETIME,
  `delivery_date` DATETIME,
  `order_id` INTEGER,
  `customer_id` INTEGER
);
INSERT INTO `Order`
  (`purchase_date`, `delivery_date`, `order_id`, `customer_id`)
VALUES
  ('2020-01-22', '2020-02-23', '3', '4'),
  ('2020-01-12', '2020-02-12', '5', '6'),
  ('2020-01-31', '2020-02-22', '6', '6'),
  ('2020-01-05', '2020-02-14', '11', '8');
CREATE TABLE Product_order (
  `po_id` INTEGER,
  `product_id` INTEGER,
  `order_id` INTEGER
);

INSERT INTO Product_order
  (`po_id`, `product_id`, `order_id`)
VALUES
  ('1', '3', '3'),
  ('2', '13', '5'),
  ('3', '45', '6'),
  ('4', '7', '11');
CREATE TABLE products (
  `product_id` INTEGER,
  `product` VARCHAR(10),
  `price` DECIMAL(5,2)
);

INSERT INTO products
  (`product_id`, `product`, `price`)
VALUES
  ('3', 'Soda', '3.99'),
  ('13', 'Chips', '7.99'),
  ('45', 'Gum', '8'),
  ('7', 'GummyBears', '12');
select o.customer_id, sum(p.price) as total_sale
from (Select distinct order_id, customer_id
    from `Order`) as o
inner join Product_order po on o.order_id = po.order_id
inner join products p on po.product_id = p.product_id
group by o.customer_id
客户 ID |总销售额 ----------: | ---------: 4 | 3.99 6 | 15.99 8 | 12.00
SELECT 
    c.name, p.product, pr.total_sale
FROM
    Customer c
        INNER JOIN
    `Order` o ON c.customer_id = o.customer_id
        INNER JOIN
    Product_order po ON o.order_id = po.order_id
        INNER JOIN
    products p ON po.product_id = p.product_id
        INNER JOIN
    (SELECT 
        o.customer_id, SUM(p.price) AS total_sale
    FROM
        (SELECT DISTINCT
        order_id, customer_id
    FROM
        `Order`) AS o
    INNER JOIN Product_order po ON o.order_id = po.order_id
    INNER JOIN products p ON po.product_id = p.product_id
    GROUP BY o.customer_id) pr ON c.customer_id = pr.customer_id
姓名 |产品 |总销售额 :--- | :--------- | ---------: 亚当 |苏打水 | 3.99 德鲁 |芯片 | 15.99 德鲁 |口香糖 | 15.99 汤姆 |小熊软糖 | 12.00

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多