题:除了返回顾客名称和订单号,返回 Customers 表中的顾客名称(cust_name)和Orders 表中的相关订单号(order_num),添加第三列 OrderTotal,其中包含每个订单的总价,并按顾客名称再按订单号对结果进行升序排序。
SELECT a.cust_name, c.order_num, SUM(c.quantity * c.item_price) AS OrderTotal FROM Customers a, Orders b, OrderItems c WHERE a.cust_id = b.cust_id and b.order_num = c.order_num GROUP BY a.cust_name, b.order_num ORDER BY a.cust_name, b.order_num
这里GROUP BY需要两个字段,如果只有一个字段呢??
----按照客户编号分组的原因:每个顾客对应着一份订单。我们按照订单分组求总价,自然而然也要按照顾客分组,求出每个订单对应的顾客;
—更直观的讲,其实就是因为不按照顾客分组就不能在select中选择顾客姓名,所以被迫要用顾客分组。
group by和select的一些总结:
如果在有group by操作中,select后面接的结果集字段只有两种:要么就只有group by后出现的字段,要么就是group by后出现的字段+聚合函数的组合
(常用的五种聚合函数:min()求列中最小数值,max()求列中最大数值,avg()求平均值,sum()求列中字段对应数值的总和,count()求列的总条数)
一个错误例子来看
SELECT is_pause,user_id,pause_type,count(stu_id) FROM call_task WHERE is_pause='1' GROUP BY is_pause,pause_type //在分组中并没有user_id这个字段
如下图虽然pause_type和学生总数这两栏数据没有问题,但是user_id那一栏显示明显不对。为什么会出现这种情况呢???因为我们在分组的时候只把is_pause和pause_type这两个字段当做分组条件,所以SQL只会对原数据库中的这两列的数据进行分组操作,其他列并不会参与到这个分组过程中(注意!!),但是在显示结果集时你非要让它显示没有进行分组操作的列,最后它采取的方式是选取满足where和分组条件时出现的第一组数据的user_id。
其实分组的思想很简单:就拿上面例子来说,把分组条件想成一个二维数组,满足这个数组就将个数加1。(is_pause,pause_type)就是一个简单的二维数组,结合筛选条件和数据库中的数据来看,(is_pause,pause_type)就分成下面三种情况:(1,2),(1,4),(1,5),遇到满足数组情况的count(stu_id)数值加1。同理,如果你的分组条件是3个,4个或者更多,就按照这个思路想。
参考自:博客
确定最佳顾客的另一种方式【INNER JOIN==直接在3表中选择】
牛客 SQL100 确定最佳顾客的另一种方式(二)
题:编写 SQL 语句,返回订单总价不小于1000 的客户名称和总额(OrderItems 表中的order_num)。
提示:需要计算总和(item_price 乘以 quantity)。按总额对结果进行排序,请使用INNER JOIN 语法。
SELECT cust_name, total_price FROM Customers c INNER JOIN Orders o ON c.cust_id = o.cust_id INNER JOIN ( SELECT order_num, SUM(item_price * quantity) AS total_price FROM OrderItems GROUP BY order_num HAVING total_price >= 1000 ) t ON t.order_num = o.order_num ORDER BY t.total_price ASC
SELECT cust_name, SUM(item_price * quantity) AS total_price FROM OrderItems a, Orders b, Customers c WHERE a.order_num = b.order_num and b.cust_id = c.cust_id GROUP BY cust_name HAVING sum(item_price * quantity) >= 1000 order by sum(item_price * quantity)
原文链接:https://blog.csdn.net/weixin_43629813/article/details/129483492