【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。订单按总订单金额降序排序。

你应该有类似的语句:

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                             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表。您需要弄清楚折扣字段的结构方式。

你应该进行这样的操作;

Select
 OrderID
 ,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.高价值客户

答案

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
Having Sum(Quantity * UnitPrice) > 10000
Order by TotalOrderAmount DESC

讨论

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

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

答案

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
Having sum(Quantity * UnitPrice) > 15000
Order by TotalOrderAmount desc;

讨论

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

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

答案

Select
 Customers.CustomerID
 ,Customers.CompanyName
 ,TotalsWithoutDiscount = SUM(Quantity * UnitPrice)
 ,TotalsWithDiscount = SUM(Quantity * UnitPrice * (1- Discount))
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
Having sum(Quantity * UnitPrice * (1- Discount)) > 10000
Order by TotalsWithDiscount DESC;

讨论

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

35.月末订单

答案

Select
 EmployeeID
 ,OrderID
 ,OrderDate 
From Orders
Where OrderDate = EOMONTH(OrderDate )
Order by
 EmployeeID
 ,OrderID

讨论

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

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

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

答案

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

讨论

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

Select top 10 With Ties
  Orders.OrderID
 ,TotalOrderDetails = count(*)
From Orders
 Join OrderDetails
 on Orders.OrderID = OrderDetails.OrderID
Group By Orders.OrderID
Order By count(*) desc

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


未完待续

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GaussDB技术解读——GaussDB架构介绍(二)

上篇图文&#xff0c;从GaussDB关键架构目标、GaussDB分布式架构、数据计算路由层&#xff08;Coordinator&#xff09;关键技术方案等三方面对GaussDB架构进行了介绍。本篇将从数据持久化存取层(DataNode)关键技术方案、全局事务管理层&#xff08;GTM&#xff09;关键技术方案…

大一学生分享网络编程聊天室-简单私聊

每天过得充实&#xff0c;你将不会焦虑 ---同行者联盟 Socket 是一种规范(标准)&#xff0c;封装了TCP协议的通信细节&#xff0c;使得我们使用它就可以完成与远端计算机的TCP链接&#xff0c;以及数据的传输。并且可以完成数据传输基于双向流的读写操作&#xff0c;Java语言…

揭秘:全自动阅读挂机项目,号称自动阅读一天窗口10-50+(脚本+教程)

首先&#xff0c;我们需要对全自动阅读挂机项目有一个基本的认识。这是一个高效利用时间和精力&#xff0c;使阅读成为一种被动行为的新型项目。它将阅读与电脑操作结合&#xff0c;通过挂机的方式&#xff0c;使得在忙碌的生活中仍能保持高效学习。 1.全自动阅读挂机项目背后…

G5 - Pix2Pix理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 理论知识图像翻译CGANU-NetPix2Pix损失函数模型结构生成器差别器 模型效果总结与心得体会 理论知识 前面已经学习了GAN与CGAN&#xff0c;这节开始学习P…

linux使用crontab定时执行url

在Linux操作系统中&#xff0c;Crontab是一个非常实用的工具&#xff0c;可以帮助用户定时执行任务&#xff0c;以达到自动化管理系统的目的。而在使用Crontab时&#xff0c;有时候我们可能需要让系统定时访问某个URL&#xff0c;以实现特定的功能或操作。本文将介绍如何使用Cr…

斯坦福新研究:RAG能帮助LLM更靠谱吗?

近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;在自然语言处理领域取得了显著的进展&#xff0c;但它们也存在一些问题&#xff0c;如容易产生幻觉和无法提供最新的知识。为了解决这些问题&#xff0c;研究人员提出了一种名为检索增强生成&#xff08;RAG&#xf…

猫头虎分享:2024应届生择业在大模型和智能机器人之间该如何选择?

猫头虎分享&#xff1a;2024应届生择业在大模型和智能机器人之间该如何选择&#xff1f; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的…

快速入门链路追踪sleuth整合zipkin(代码演示)

1、演示项目背景 2、pom.xml 3、启动项目 4、测试 5、保存数据到数据库 6、通过mq保存数据到mysql 7、通过mq保存数据到es 1、演示项目背景 下载zipkin&#xff0c;建议使用2.x版本的&#xff0c;3.x版本的要求jdk高版本。如果自己是1.8&#xff0c;就下载2.x的 下载地…

Postman环境变量以及设置token全局变量!

前言百度百科解释&#xff1a; 环境变量&#xff08;environment variables&#xff09;一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;如&#xff1a;临时文件夹位置和系统文件夹位置等。 环境变量是在操作系统中一个具有特定名字的对象&#xff0c;它…

Ubuntu server 24 (Linux) 安装部署 Zabbix 7.0 LTS

一 安装Mysql 8.03 testtest:~$ mysqld --version /usr/sbin/mysqld Ver 8.0.36-2ubuntu3 for Linux on x86_64 ((Ubuntu)) #mysql 大于8.03.x ,启动zabbix-server会报错如下 Unable to start Zabbix server due to unsupported MySQL database version (8.04.00). Must not…

英伟达最新GPU和互联路线图分析

Nvidia在计算、网络和图形领域独树一帜&#xff0c;其显著优势在于雄厚的资金实力及在生成式人工智能市场的领先地位。凭借卓越的架构、工程和供应链&#xff0c;Nvidia能够自由实施创新路线图&#xff0c;引领行业未来。 到 21 世纪&#xff0c;Nvidia 已经是一个非常成功的创…

GStreamer学习2.1----获取mp4中的图片

这里通过获取mp4中的图片例子来加深Gstreamer的理解&#xff0c;问问AI实现这样功能的命令&#xff0c; 得到 gst-launch-1.0 filesrc locationtest.mp4 ! qtdemux ! queue ! h264parse ! avdec_h264 ! videoconvert ! jpegenc ! multifilesink locationoutput_image_%03d.jp…

大福利!微信付费进群源码

微信付费进群源码 前言效果图搭建教程源码领取下期更新预报 前言 1、修复SQL表 2、修复支付文件 3、修复支付图标不显示 4、修复定位、分销逻辑、抽成逻辑 5、新增支持源支付、易支付的支付接口 6、修复官方微信、支付宝支付接口文件 本来早就可以完工的&#xff0c;电脑…

MEGALODON:突破传统,实现高效无限上下文长度的大规模语言模型预训练和推理

在人工智能领域&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;大模型&#xff08;LLMs&#xff09;的预训练和推理效率一直是研究的热点。最近&#xff0c;一项突破性的研究提出了一种新型神经网络架构——MEGALODON&#xff0c;旨在解决传统Tran…

Redis 7.2.x 主从复制+哨兵模式

IP操作系统服务版本192.168.140.153CentOS 7redis-master,sentinel7.2.5192.168.140.156CentOS 7redis-slave,sentinel7.2.5192.168.140.159CentOS 7redis-slave,sentinel7.2.5 一、安装Redis 配置主从复制 参考下面文档&#xff1a; Redis 7.2.x 主从复制-CSDN博客文章浏览…

论文略读:Onthe Expressivity Role of LayerNorm in Transformers’ Attention

ACL 2023 研究了LayerNorm在 Transformers 中对注意力的作用LayerNorm为Transformer的Attention提供了两个重要的功能&#xff1a; 投影&#xff0c;projection LayerNorm 帮助 Attention 设计一个注意力查询&#xff0c;这样所有的Key都可以平等地访问通过将Key向量投影到同一…

pinctrl 和 gpio 子系统实验学习

pinctrl 子系统主要工作内容如下&#xff1a; ①、获取设备树中 pin 信息。 ②、根据获取到的 pin 信息来设置 pin 的复用功能 ③、根据获取到的 pin 信息来设置 pin 的电气特性&#xff0c;比如上/下拉、速度、驱动能力等。 对于我们使用者来讲&#xff0c;只需要在设备树里面…

【计算机网络基础】OSI七层网络模型 TCPIP四层网络模型

文章目录 ISO介绍网络模型介绍OSI七层模型OSI七层模型介绍OSI七层特点一、TCP/IP四层模型介绍二、TCP/IP四层模型TCP/IP协议簇一次C/S通信 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分…

人工智能和机器学习这两个概念有什么区别?

什么是人工智能&#xff1f; 先来说下人工智能&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI&#xff0c;通俗来讲就是用机器去做在过去只有人能做的事。 人工智能最早是由图灵提出的&#xff0c;在1950年&#xff0c;计算机…

【背就有效】软考中项计算公式汇总,简答题轻松拿下

宝子们注意啦&#xff01;系统集成管理师的报名8月就要开始啦&#xff01;你准备好迎接挑战了吗&#xff1f; 备考下半年软考的小伙伴们&#xff0c;在这里给大家准备了一份超实用的备考秘籍——系统集成项目管理工程师计算公式汇总。亲测有效&#xff0c;每天只需抽出一点时间…