【SQL边干边学系列】05高级问题


前言

在这里插入图片描述
该系列教程,将会从实际问题出发,边干边学,逐步深入讲解SQL的各方面知识。

你需要完成所有的问题吗?绝对不是。介绍性的问题相当简单,所以你可以直接跳过到“中级问题”部分。如果你不是初学者,但不确定应该从哪里开始,请在“入门问题”部分看看问题和预期结果,并确保你理解这些概念。如果已经理解了这些概念,请开始阅读“中级问题”部分。

你想从这本书中复制代码并在你的服务器上运行?我建议你手动输入,而不是复制粘贴。为什么要去麻烦地重新打字呢?科学表明,打字的行为会在你的脑中留下更深刻的印象。当你只是复制和粘贴时,代码只是直接从你电脑里的一个窗口转到另一个窗口,而不会给你留下多少印象。但是当你把它打出来时,你必须集中精力,这非常有助于保留信息。

一旦你完成了所有的问题,将拥有一些在数据分析和高级Select语句使用方面非常有用的技能。当然,这并不是SQL的全部内容。还有修改数据(更新、插入、删除)、DDL(数据定义语言,即如何创建和修改数据库对象)、编程(如存储过程)和许多其他主题。

该系列教程中,只涉及到了使用Select语句检索数据的问题,这几乎是所有其他数据库主题的基础开端。


回顾

上篇文章👉《【SQL边干边学系列】04中级问题(续)》 讨论了剩余的中级问题。这篇开始讨论高级问题。


高级问题

32.高价值客户

我们想给所有的客户送一份特别的贵宾礼物。我们将高价值的客户定义为那些至少有1个订单,总价(不包括折扣)等于1万元或以上的客户。我们只想考虑2016年的订单。

-- 预期结果
CustomerID CompanyName                              OrderID     TotalOrderAmount
---------- ---------------------------------------- ----------- ---------------------
QUICK QUICK-Stop                                    10865       17250.00
SAVEA Save-a-lot Markets                            11030       16321.90
HANAR Hanari Carnes                                 10981       15810.00
KOENE Königlich Essen                               10817       11490.70
RATTC Rattlesnake Canyon Grocery                    10889       11380.00
HUNGO Hungry Owl All-Night Grocers                  10897       10835.24
(6 row(s) affected)

提示如下

首先,让我们得到2016年所有订单的必要字段。不要使用分组,只使用Where子句。你将需要CustomerID、Customers表的CompanyName、Orders表中的OrderID、以及OrderDetails表中的Quantity和unit price。订单按总订单金额降序排序。

你应该有类似的语句:

Select
 Customers.CustomerID
 ,Customers.CompanyName
 ,Orders.OrderID
 ,Amount = Quantity * UnitPrice
From Customers
 join Orders
 on Orders.CustomerID = Customers.CustomerID
 join OrderDetails
 on Orders.OrderID = OrderDetails.OrderID
Where
 OrderDate >= '20160101'
 and OrderDate < '20170101'

这给出了2016年的每个订单的总金额。现在,你需要对哪些字段进行分组,哪些字段进行求和?

Select
 Customers.CustomerID
 ,Customers.CompanyName
 ,Orders.OrderID
 ,TotalOrderAmount = sum(Quantity * UnitPrice)
From Customers
 Join Orders
 on Orders.CustomerID = Customers.CustomerID
 Join OrderDetails
 on Orders.OrderID = OrderDetails.OrderID
Where
 OrderDate >= '20160101'
 and OrderDate < '20170101'
Group By
 Customers.CustomerID
 ,Customers.CompanyName
 ,Orders.OrderID

客户和订单级别的字段需要按分组,并对总金额进行汇总。

为了获得1万元或更多的订单?能直接写在Where子句中吗?

33.高价值的客户-总订单数

经理已经改变了主意。他不要求客户至少拥有一个总计1万元或以上的单独订单,而是将高价值客户定义为2016年拥有总计1.5万元或以上订单的客户。你将如何改变上述问题的答案?

-- 预期结果
CustomerID CompanyName                              TotalOrderAmount
---------- ---------------------------------------- ---------------------
SAVEA      Save-a-lot Markets                        42806.25
ERNSH      Ernst Handel                              42598.90
QUICK      QUICK-Stop                                40526.99
HANAR      Hanari Carnes                          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构师昌哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值