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

文章目录

  • 前言
  • 回顾
  • 高级问题
    • 32.高价值客户
    • 33.高价值的客户-总订单数
    • 34.高价值的客户-带有折扣
    • 35.月末订单
    • 36.具有许多详细信息行的订单
  • 答案
    • 32.高价值客户
    • 33.高价值的客户-总订单数
    • 34.高价值的客户-带有折扣
    • 35.月末订单
    • 36.具有许多详细信息行的订单
  • 未完待续


前言

在这里插入图片描述
该系列教程,将会从实际问题出发,边干边学,逐步深入讲解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。订单按总订单金额降序排序。

你应该有类似的语句:

SelectCustomers.CustomerID,Customers.CompanyName,Orders.OrderID,Amount = Quantity * UnitPrice
From Customersjoin Orderson Orders.CustomerID = Customers.CustomerIDjoin OrderDetailson Orders.OrderID = OrderDetails.OrderID
WhereOrderDate >= '20160101'and OrderDate < '20170101'

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

SelectCustomers.CustomerID,Customers.CompanyName,Orders.OrderID,TotalOrderAmount = sum(Quantity * UnitPrice)
From CustomersJoin Orderson Orders.CustomerID = Customers.CustomerIDJoin OrderDetailson Orders.OrderID = OrderDetails.OrderID
WhereOrderDate >= '20160101'and OrderDate < '20170101'
Group ByCustomers.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                             24238.05
HUNGO      Hungry Owl All-Night Grocers              22796.34
RATTC      Rattlesnake Canyon Grocery                21725.60
KOENE      Königlich Essen                           20204.95
FOLKO      Folk och fä HB                            15973.85
WHITC      White Clover Markets                      15278.90
(9 row(s) affected)

提示:这个查询几乎与上面的查询相同,但只需要删除几行查询或注释掉,以便在不同的级别上进行分组。

34.高价值的客户-带有折扣

更改上述查询,以便在计算高价值客户时使用折扣。按包括折扣在内的总金额。

-- 预期结果
CustomerID  CompanyName                   TotalsWithoutDiscount TotalsWithDiscount
---------- ------------------------------ --------------------- ----------------------
ERNSH      Ernst Handel                   42598.90              41210.6500244141
QUICK      QUICK-Stop                     40526.99              37217.3150024414
SAVEA      Save-a-lot Markets             42806.25              36310.1097793579
HANAR      Hanari Carnes                  24238.05              23821.1999893188
RATTC      Rattlesnake Canyon Grocery     21725.60              21238.2704410553
HUNGO      Hungry Owl All-Night Grocers   22796.34              20402.119934082
KOENE      Königlich Essen                20204.95              19582.7739868164
WHITC      White Clover Markets           15278.90              15278.8999862671
FOLKO      Folk och fä HB                 15973.85              13644.0674972534
SUPRD      Suprêmes délices               11862.50              11644.5999984741
BOTTM      Bottom-Dollar Markets          12227.40              11338.5500488281
(11 row(s) affected)

提示如下

首先,只需使用OrderDetails表。您需要弄清楚折扣字段的结构方式。

你应该进行这样的操作;

SelectOrderID,ProductID,UnitPrice,Quantity,Discount ,TotalWithDisccount = UnitPrice * Quantity * (1- Discount)
from OrderDetails

请注意,折扣是以百分比的形式呈现的。因此,如果在折扣字段中有一个0.15,那么你需要将UnitPrice乘以Quantity再乘以0.85(1.00-0.15)。你需要使用(1 -折扣)以确保首先完成折扣计算。

35.月末订单

在月底,销售人员可能会更努力地获得订单,以满足他们的月底配额。显示在每月的最后一天发出的所有订单。按EmployeeID和OrderID排序。

-- 预期结果
EmployeeID  OrderID     OrderDate
----------- ----------- -----------------------
1 10461     2015-02-28  00:00:00.000
1 10616     2015-07-31  00:00:00.000
2 10583     2015-06-30  00:00:00.000
2 10686     2015-09-30  00:00:00.000
2 10989     2016-03-31  00:00:00.000
2 11060     2016-04-30  00:00:00.000
3 10432     2015-01-31  00:00:00.000
3 10806     2015-12-31  00:00:00.000
3 10988     2016-03-31  00:00:00.000
3 11063     2016-04-30  00:00:00.000
4 10343     2014-10-31  00:00:00.000
4 10522     2015-04-30  00:00:00.000
4 10584     2015-06-30  00:00:00.000
4 10617     2015-07-31  00:00:00.000
4 10725     2015-10-31  00:00:00.000
4 10807     2015-12-31  00:00:00.000
4 11061     2016-04-30  00:00:00.000
4 11062     2016-04-30  00:00:00.000
5 10269     2014-07-31  00:00:00.000
6 10317     2014-09-30  00:00:00.000
7 10490     2015-03-31  00:00:00.000
8 10399     2014-12-31  00:00:00.000
8 10460     2015-02-28  00:00:00.000
8 10491     2015-03-31  00:00:00.000
8 10987     2016-03-31  00:00:00.000
9 10687     2015-09-30  00:00:00.000
(26 row(s) affected)

提示:你可以自己计算这个日期,比如DateAdd和DateDiff函数。

36.具有许多详细信息行的订单

显示详细信息行最多的10个订单。

-- 预期结果
OrderID     TotalOrderDetails
----------- -----------------
11077       25
10979       6
10657       6
10847       6
10845       5
10836       5
10714       5
10670       5
10691       5
10698       5
(10 row(s) affected)

提示:使用Orders和 OrderDetails,使用 Group by和 count()功能。


答案

32.高价值客户

答案

SelectCustomers.CustomerID,Customers.CompanyName,Orders.OrderID,TotalOrderAmount = SUM(Quantity * UnitPrice)
From CustomersJoin Orderson Orders.CustomerID = Customers.CustomerIDJoin OrderDetailson Orders.OrderID = OrderDetails.OrderID
WhereOrderDate >= '20160101'and OrderDate < '20170101'
Group byCustomers.CustomerID,Customers.CompanyName,Orders.Orderid
Having Sum(Quantity * UnitPrice) > 10000
Order by TotalOrderAmount DESC

讨论

如果你尝试把这个过滤器and sum(Quantity * UnitPrice) >= 10000放在Where字句中,将得到错误。聚合函数过滤只能用在 Having子句中(除了某些例外),而不是Where子句。

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

答案

SelectCustomers.CustomerID,Customers.CompanyName--,Orders.OrderID,TotalOrderAmount = SUM(Quantity * UnitPrice)
From CustomersJoin Orderson Orders.CustomerID = Customers.CustomerIDJoin OrderDetailson Orders.OrderID = OrderDetails.OrderID
WhereOrderDate >= '20160101'and OrderDate < '20170101'
Group byCustomers.CustomerID,Customers.CompanyName--,Orders.Orderid
Having sum(Quantity * UnitPrice) > 15000
Order by TotalOrderAmount desc;

讨论

这里所需要的只是注释掉Group By子句中对Orders.Orderid的引用。通过这样做,我们是在客户级别进行分组,而不是在订单级别。

34.高价值的客户-带有折扣

答案

SelectCustomers.CustomerID,Customers.CompanyName,TotalsWithoutDiscount = SUM(Quantity * UnitPrice),TotalsWithDiscount = SUM(Quantity * UnitPrice * (1- Discount))
From CustomersJoin Orderson Orders.CustomerID = Customers.CustomerIDJoin OrderDetailson Orders.OrderID = OrderDetails.OrderID
WhereOrderDate >= '20160101'and OrderDate < '20170101'
Group byCustomers.CustomerID,Customers.CompanyName
Having sum(Quantity * UnitPrice * (1- Discount)) > 10000
Order by TotalsWithDiscount DESC;

讨论

请注意,你需要对“Select”子句、“Having”子句以及“ Order by”子句中的带有折扣的订单总额使用新的计算方法。在 Order by子句中,您可以重复使用在Select子句中创建的别名,但在Having子句中,您需要重复计算。

35.月末订单

答案

SelectEmployeeID,OrderID,OrderDate 
From Orders
Where OrderDate = EOMONTH(OrderDate )
Order byEmployeeID,OrderID

讨论

EOMONTH函数是在SQL Server 2012中引入的,所以在此之前,开发人员必须使用如下函数组合:

Where OrderDate = dateadd(month,1 + datediff(month,0,OrderDate),-1)

36.具有许多详细信息行的订单

答案

Select top 10 Orders.OrderID,TotalOrderDetails = count(*)
From OrdersJoin OrderDetailson Orders.OrderID = OrderDetails.OrderID
Group By Orders.OrderID
Order By count(*) desc

讨论

当你选择前50名而不是前10名时,会发生什么呢?会有更多总数为5的行出现。如果你想显示所有的结果,你可以使用以下操作:

Select top 10 With TiesOrders.OrderID,TotalOrderDetails = count(*)
From OrdersJoin OrderDetailson Orders.OrderID = OrderDetails.OrderID
Group By Orders.OrderID
Order By count(*) desc

注意,相同的查询,使用“With Ties”关键字,现在返回37行,因为有许多行的值为5。


未完待续

今天我们讨论了高级问题中的前5个问题,下一次我们接着讲其它高级问题。


如果喜欢这篇文章,请不要忘记关注🧡、点赞👍和收藏📔哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/851480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新品发布 | 捷云等保一体机2.0全新上市,助力中小企业破解等保难题

等保2.0时代&#xff0c;随着网络威胁不断复杂化和组织化&#xff0c;作为网络安全“弱势群体”的中小企业&#xff0c;等保建设工作正面临着安全意识、管理、人才、资金捉襟见肘等问题&#xff0c;主要体现在以下两个方面&#xff1a; 等保建设流程复杂 中小企事业单位缺乏专…

jvm学习笔记(二) ----- 垃圾回收

GC 一、判定对象是否是垃圾1.引用计数法2.可达性分析算法 二、垃圾回收算法1.标记清除2.标记整理3. 复制4. 分代垃圾回收1.尝试在伊甸园分配2.大对象直接晋升至老年代3.多次存活的对象4.老年代连续空间不足&#xff0c;触发 Full GC 链接: jvm学习笔记(一) ----- JAVA 内存 链接…

解析智慧机场系统的架构与未来发展趋势

在全球航空业快速发展的背景下&#xff0c;智慧机场系统已经成为提升机场运营效率、优化旅客体验的重要手段。智慧机场系统的架构设计涵盖了多个方面&#xff0c;从航班管理到安全检查&#xff0c;从旅客服务到数据分析&#xff0c;都有着精心设计和完善的技术支持。本文将深入…

Apipost安装教程

&#x1f4d6;Apipost安装教程 ✅1. 下载✅2. 安装 ✅1. 下载 官网地址&#xff1a;https://www.apipost.cn/ 选择免费版&#xff0c;下载对应系统的安装包即可。 ✅2. 安装 1.点击运行apipost_win_x64_8.0.11.exe安装包&#xff0c;并选择用户安装&#xff0c;下一步 2.选…

【Kubernetes】Ingress 对外服务、ingress-controlle

Ingress 简介 service的作用体现在两个方面&#xff1a; 对集群内部&#xff0c;它不断跟踪pod的变化&#xff0c;更新endpoint中对应pod的对象&#xff0c;提供了ip不断变化的pod的服务发现机制&#xff1b; 对集群外部&#xff0c;他类似负载均衡器&#xff0c;可以在集群内…

如何评估pcdn调度算法的优化效果(壹)

评估PCDN&#xff08;Peer-assisted Content Delivery Network&#xff0c;对等网络内容分发网络&#xff09;调度算法的优化效果是一个综合且系统的过程&#xff0c;涉及多个维度的考量。以下是一些建议的步骤和考量因素&#xff0c;以便全面评估优化效果&#xff1a; 一&…

服务部署:解决Docker容器与虚拟机主机之间MySql连接访问问题

一、场景&#xff1a; 虚拟机上Ubuntu系统安装了Mysql&#xff0c;现在有一个服务应用需要使用docker来部署&#xff0c;服务应用需要连接mysql做数据库基础使用&#xff0c;配置文件中配置了虚拟主机的IP和端口&#xff0c;但是还是无法连接到Mysql&#xff0c;报错无法连接超…

stm32MP135裸机编程:修改基于SD卡的FSBL-A用户程序引导程序(boot)

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf stm32mp135官方开发板原理图&#xff08;mb1635-bdp-v1-0.zip&#xff09; STM32Cube_FW_MP13_V1.0.0 STM32CubeIDE v1.15 1 为什么需要修改FSBL-A用户程序引导程序 FSBL-A用户程序引导程序的作用在《…

03-240605-Spark笔记

03-240605 1. 行动算子-1 reduce 聚合 格式: def reduce(f: (T, T) > T): T 例子&#xff1a; val sparkConf new SparkConf().setMaster("local[*]").setAppName("Operator")val sc new SparkContext(sparkConf) ​val rdd sc.makeRDD(List(1…

基础IO (Linux文件操作)

目录 1.文件操作 2.文件描述符 3.缓冲区 4.系统的缓冲区 1.文件操作 在C语言学习中&#xff0c;我们就已经使用了一些文件操作相关的接口&#xff0c;在学习IO之前&#xff0c;我们首先要复习一些以前讲过的概念&#xff0c; 1. 空文件也要在磁盘中占用空间&#xff0c;因为…

OBS 录屏软件 for Mac 视频录制和视频实时交流软件 安装

Mac分享吧 文章目录 效果一、准备工作二、开始安装注意事项&#xff1a;包内有两个版本及圆形图片&#xff0c;请根据自身需要版本进行安装演示为&#xff1a;MacBook Pro M3芯片1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff08;最终目的&#xff1a;安装进…

python教程

python解释器的安装 https://www.python.org/ftp/python/3.12.4/python-3.12.4-amd64.exe jetbrains官网 英文 PyCharm 专业的版本 Thank you for downloading PyCharm! 社区 Thank you for downloading PyCharm! 中文 PyCharm 专业的版本 感谢您下载PyCharm&#xff01…

[大模型]GLM-4-9B-Chat WebDemo 部署

环境准备 在autodl平台中租一个4090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.1.0–>3.10(ubuntu22.04)–>12.1 接下来打开刚刚租用服务器的JupyterLab&#xff0c; 图像 并且打开其中的终端开始环境配置、模型下载和运行演示。 pip换源和安装…

【图论应用】使用多路图(multigraph)对上海地铁站点图建模,并解决最短路径问题

文章目录 1 前言2 导包导入数据集3 创建多路图&#xff0c;导入节点和边信息3 绘制线路图4 计算最短路径 1 前言 最近正在学习图神经网络&#xff0c;先pick up了一些最基础的图论知识并学习了一些好玩的应用。 本文启发于B站视频&#xff08;BV1LY411R7HJ&#xff09;&#…

【python】flask 框架

python flask 框架 flask是一个轻量级的python后端框架 (Django, tornado, flask) 官网&#xff1a;欢迎来到 Flask 的世界 — Flask中文文档(3.0.x) 安装&#xff1a;pip install Flask -i https://pypi.douban.com 常识&#xff1a; http,默认端口号为80; https,默认端口号…

国资e学快速学习实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

OSPF LSA头部详解

LSA概述 LSA是OSPF的本质 , 对于网工来说能否完成OSPF的排错就是基于OSPF的LSDB掌握程度 . 其中1/2类LAS是负责区域内部的 类似于设备的直连路由 . 加上对端的设备信息 3 类LSA是区域间的 指的是Area0和其他Area的区域间关系 , 设计多区域的初衷就是避免大型OSPF环境LSA太多…

Go模板页面浏览器显示HTML源码问题

<!--* Title: This is a file for ……* Author: JackieZheng* Date: 2024-06-09 17:00:01* LastEditTime: 2024-06-09 17:01:12* LastEditors: Please set LastEditors* Description:* FilePath: \\GoCode\\templates\\index.html --> <!DOCTYPE html> <html …

【RAG】浅尝基于多头注意力机制思想设计的Multi-Head RAG(多头RAG)

一、动机 现有RAG设计和评估方法&#xff0c;没有方案或评估方法明确针对具有多方面性的问题。下面解释一下多方面性的问题&#xff1a; "多方面性的问题"是指那些需要理解和整合多个不同领域或主题的知识和信息才能得到完整和准确回答的问题。这类问题的特点在于它…

Characters 2 01(卡通可爱人物动画模型)

● 包裹● - 26名男子; - 29个女孩。 ● 使用地点 ● - 游戏。针对游戏引擎优化的模型; -乘法; 广告和营销; - 虚拟现实/增强现实。 ● 特点 ● - 你可以很容易地改变物体的颜色 - 使用UV贴图; - 对象逻辑位置的枢轴; - 模型具有逻辑名称。 ● 几何学● 62个独特的资产(…