mysql - 如何显示每位客户所有订单的总成本?(子查询)
问题描述
我想显示他们订单的总成本,并显示他们购买的每件商品。当我按订单号排序时,总和(价格)就搞砸了。当我按客户名称排序时,它只显示一种产品。我如何显示他们购买的所有产品以及这些产品的总成本。*每个订单都附有一件产品。具有唯一的订单号
这些是我创建的虚构表格,与我自己的非常相似。
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|
+------+------------+-----------------+
解决方案
数据不符合想要的结果,但这只是一个小问题
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<>在这里摆弄
推荐阅读
- sql-server - SQL Server LDAP 按 IP 地址过滤组或用户
- amazon-web-services - scp 到 AWS EC2 权限被拒绝
- android - 配置文件或调试 APK:生成签名的 Bundle 需要您将 Android Gradle 插件更新到版本 3.2.0
- google-sheets - Google 表格中的多项汇总
- nlp - Agnews 库“NotImplementedError”
- algorithm - 用于查询给定区间是否被一组其他区间包围的数据结构
- c# - asp.net如何记住网页之间的变量值
- java - MapStruct:考虑在您的配置中定义“com.npdrums.cms.interfaces.DtoMapper”类型的 bean
- python - 如何在线性回归方程中找到结果的平均值
- java - 余数运算符是否容易受到浮点错误的影响?