SQL Server 中count方法和case when语句配合使用中的问题

news/2024/11/8 17:45:37/

概要

我们在使用SQL Server生成报表统计数据的时候,经常使用sum,count等聚合函数,有时候还会配合case when语句一边执行过滤操作,一边进行聚合。

本文介绍一个在使用中的常见的错误和解决方法。

设计和实现

下面是一张订单记录表,我们要统计2019年,2020年和2021年每个客户的的订单金额总数和订单数量。

在这里插入图片描述
我们使用常见的聚合函数sum和count 实现统计功能:

SELECT customer_id,customer_name,sum(caseWHEN format(billing_creation_date, 'yyyy') = '2019' THENbilling_amountELSE 0END ) AS amount_2019, sum(caseWHEN format(billing_creation_date, 'yyyy') = '2020' THENbilling_amountELSE 0END ) AS amount_2020, sum(caseWHEN format(billing_creation_date, 'yyyy') = '2021' THENbilling_amountELSE 0END ) AS amount_2021, count(caseWHEN format(billing_creation_date, 'yyyy') = '2019' THENbilling_amountELSE 0END ) AS cnt_2019, count(caseWHEN format(billing_creation_date, 'yyyy') = '2020' THENbilling_amountELSE 0END ) AS cnt_2020, count(caseWHEN format(billing_creation_date, 'yyyy') = '2020' THENbilling_amountELSE 0END ) AS cnt_2021
FROM billings
GROUP BY  customer_id, customer_name

代码执行结果如下:

在这里插入图片描述
显然,订单个数的统计是错误的。

我们以2019年为例,在进行sum操作时候,如果是2019年的数据,则进行累加;如果不是2019年,也进行累加,但是累加数为0, 所以结果正确。

但是我们计算订单个数时候,如果是2019年的数据,则该条记录符合要求,返回一个数字,订单数加1;如果不是2019年,返回0, 0也是一个数字,所以订单数也会加1,只要有返回值,count就会自动加1。

解决方法就是如果是非2019年的记录,不再返回任何数字或字符串,只返回null。这样count在统计时候,就不会自动加1。

正确代码如下:

SELECT customer_id,customer_name,sum(caseWHEN format(billing_creation_date, 'yyyy') = '2019' THENbilling_amountELSE 0END ) AS amount_2019, sum(caseWHEN format(billing_creation_date, 'yyyy') = '2020' THENbilling_amountELSE 0END ) AS amount_2020, sum(caseWHEN format(billing_creation_date, 'yyyy') = '2021' THENbilling_amountELSE 0END ) AS amount_2021, count(caseWHEN format(billing_creation_date, 'yyyy') = '2019' THENbilling_amountELSE nullEND ) AS cnt_2019, count(caseWHEN format(billing_creation_date, 'yyyy') = '2020' THENbilling_amountELSE nullEND ) AS cnt_2020, count(caseWHEN format(billing_creation_date, 'yyyy') = '2020' THENbilling_amountELSE nullEND ) AS cnt_2021
FROM billings
GROUP BY  customer_id, customer_name

附录

建表语句:

if OBJECT_ID('billings','U') is not null
drop table billings create table billings(id tinyint primary key identity(1,1),customer_id tinyint not null,customer_name nvarchar(10) not null,billing_id char(3) not null,billing_creation_date date not null,billing_amount int not null
)insert into billings (customer_id, customer_name, billing_id, billing_creation_date, billing_amount) values(1, 'A', 'k11', '10-10-2020', 100),
(1, 'A', 'k12', '11-11-2020', 150),
(1, 'A', 'k13', '12-11-2021', 100),(2, 'B', 'k34', '10-11-2019', 150),
(2, 'B', 'k35', '11-11-2020', 200),
(2, 'B', 'k36', '12-11-2021', 250),(3, 'C', 'k47', '01-01-2018', 100),
(3, 'C', 'k48', '05-01-2019', 250),
(3, 'C', 'k49', '06-01-2021', 300)

http://www.ppmy.cn/news/381761.html

相关文章

HMI-66-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移

HMI-66-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移 文章目录 HMI-66-【MeterDisplay for Arm Linux】液晶仪表Arm Linxu迁移摘要修改Pro文件设置CPU亲缘性后面的解决思路1 只用大量属性动画,替换部分效果,现在使用了定时器2 使用新的框架&…

嗨,这里有一个满足ISO 26262 ASIL-D功能安全的整车控制器,你不了解一下吗?

背景介绍 为了保证汽车电子电气的可靠性设计,在2011年发布了ISO 26262(道路车辆功能安全标准),ISO 26262标准横向视角来看,解决的问题是:减少汽车电子电气系统发生系统性失效的可能性,采用的方…

汇川H5U和三菱Q系列内置以太网做MODBUS通讯

汇川H5U和三菱Q系列内置以太网做MODBUS通讯 PLC型号: 汇川H5U-1614MTD,三菱Q03UDV 主从方式: 汇川做modbus/tcp从站,三菱做主站读取。 3配置方式; 1、汇川做modbus/tcp从站,H5U默认开启modbus/tcp从站服…

M65

算起来等这部手机也等了我半年了,先等着它上市,再等着它降价。不知道西门子搞什么鬼,大陆就是不降。只好上澳门买了,两地差价最少500RMB,算上来回路费,还是赚了。可惜没有买到数据线还有耳机,还…

网络安全|渗透测试入门学习,从零基础入门到精通—收集信息篇

目录 前面的话 1、收集域名信息 1.1、Whois查询 ​编辑1.2、备案信息查询 2、收集敏感信息 3、收集子域名信息 3.1、子域名检测工具 3.2、搜索引擎枚举 3.3、第三方聚合应用枚举 3.4、证书透明度公开日志枚举 本章小结 前面的话 本人喜欢网络完全的一些知识&#xff…

java的转换流、压缩流、序列化流、打印流

一、转换流 转换流属于字符流,也是一种高级流,用来包装Reader和Writer。转化流是字符流和字节流之间的桥梁。转换输入流为InputStreamReader,把把字节流转化为字符流;转化输出流为OutputStreamWriter,把字符流转化为字…

快速入门教程:神经常微分方程 (Neural ODE)

神经常微分方程(Neural Ordinary Differential Equations,简称 Neural ODE)是一种基于常微分方程(Ordinary Differential Equations,ODEs)的深度学习方法,它结合了传统的ODE数值求解技术和神经网络模型。通过使用ODE来建模数据的演化过程,Neural ODE可以自动地学习数据…

深入探究生成对抗网络(GAN):原理与代码分析

文章目录 1. 应用领域1.1 图像生成1.2 图像编辑和重建1.3 视频生成1.4 文本生成1.5 音乐生成1.1 虚拟现实增强 2. GAN的原理2.1 核心概念2.2 网络结构2.3 损失函数2.4 训练过程 3. GAN图像生成任务应用 生成对抗网络(Generative Adversarial Network, GAN&#xff0…