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

news2024/11/23 13:12:16

概要

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

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

设计和实现

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

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

SELECT customer_id,
         customer_name,
         sum(case
    WHEN format(billing_creation_date, 'yyyy') = '2019' THEN
    billing_amount
    ELSE 0
    END ) AS amount_2019, sum(case
    WHEN format(billing_creation_date, 'yyyy') = '2020' THEN
    billing_amount
    ELSE 0
    END ) AS amount_2020, sum(case
    WHEN format(billing_creation_date, 'yyyy') = '2021' THEN
    billing_amount
    ELSE 0
    END ) AS amount_2021, count(case
    WHEN format(billing_creation_date, 'yyyy') = '2019' THEN
    billing_amount
    ELSE 0
    END ) AS cnt_2019, count(case
    WHEN format(billing_creation_date, 'yyyy') = '2020' THEN
    billing_amount
    ELSE 0
    END ) AS cnt_2020, count(case
    WHEN format(billing_creation_date, 'yyyy') = '2020' THEN
    billing_amount
    ELSE 0
    END ) 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(case
    WHEN format(billing_creation_date, 'yyyy') = '2019' THEN
    billing_amount
    ELSE 0
    END ) AS amount_2019, sum(case
    WHEN format(billing_creation_date, 'yyyy') = '2020' THEN
    billing_amount
    ELSE 0
    END ) AS amount_2020, sum(case
    WHEN format(billing_creation_date, 'yyyy') = '2021' THEN
    billing_amount
    ELSE 0
    END ) AS amount_2021, count(case
    WHEN format(billing_creation_date, 'yyyy') = '2019' THEN
    billing_amount
    ELSE null
    END ) AS cnt_2019, count(case
    WHEN format(billing_creation_date, 'yyyy') = '2020' THEN
    billing_amount
    ELSE null
    END ) AS cnt_2020, count(case
    WHEN format(billing_creation_date, 'yyyy') = '2020' THEN
    billing_amount
    ELSE null
    END ) 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.coloradmin.cn/o/645263.html

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

相关文章

【链表复习】C++ 链表复习及题目解析 (2)

目录 牛客 CM11 链表分割 牛客 OR36 之链表的回文结构 Leetcode 160. 相交链表 LeetCode 141. 环形链表 LeetCode 138. 复制带随机指针的链表 本文继续延续前文,为大家带来几道经典的链表中等难度的题目。 牛客 CM11 链表分割 现有一链表的头指针 ListNode* p…

探索iOS之Metal标准库

Metal标准库包括&#xff1a;通用函数、整型函数、关系函数、数学函数、矩阵运算、SIMD运算、几何函数、纹理函数等。接下来让我们走进Metal标准库的世界。 1、通用函数 通用函数在<metal_common>头文件中&#xff0c;T为scalar或vector的浮点类型。如下表所示&#xf…

公司最大的内卷,是OKR驱动

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 去年5月&#xff0c;以善用OKR独步江湖的Google公司宣布将对 Google 员工的绩效管理方式进行改革——Google 开始使用一种名为 GRAD 的新绩效评估流程。据了解&#xff0c;这一调整主要是基于员工对谷…

集权设施管理-AD域安全策略(二)

活动目录&#xff08;AD&#xff09;凭借其独特管理优势&#xff0c;从众多企业管理服务中脱颖而出&#xff0c;成为内网管理中的佼佼者。采用活动目录来管理的内网&#xff0c;称为AD域。 了解AD域&#xff0c;有助于企业员工更好地与其它部门协作&#xff0c;同时提高安全意…

算法练习5:二进制字符串前缀一致的次数

给你一个长度为 n 、下标从 1 开始的二进制字符串&#xff0c;所有位最开始都是 0 。我们会按步翻转该二进制字符串的所有位&#xff08;即&#xff0c;将 0 变为 1&#xff09;。 给你一个下标从 1 开始的整数数组 flips &#xff0c;其中 flips[i] 表示对应下标 i 的位将会在…

docker容器 - 卷(volume)- 挂载

目录 参考文档&#xff1a;Volumes | Docker Documentation 什么是卷&#xff08;volume&#xff09;&#xff1f; 什么是挂载&#xff0c;它的作用是什么&#xff1f; 一台机器里的多个容器之间共享数据&#xff08;使用挂载&#xff09; 首先我们可以使用最简单的docker …

预训练、微调和上下文学习

最近语言模型在自然语言理解和生成方面取得了显著进展。这些模型通过预训练、微调和上下文学习的组合来学习。在本文中将深入研究这三种主要方法&#xff0c;了解它们之间的差异&#xff0c;并探讨它们如何有助于语言模型的学习过程。 预训练 预训练&#xff08;Pre-training&…

RadEx Pro处理电火花数据操作步骤(上)

最近单位采集了很多的电火花测线&#xff0c;同事在使用GeoSuite AllWorks 2022R1处理这些测线的时候&#xff0c;发现二次波对地层辨识和划分干扰比较严重。GeoSuite AllWorks 压制二次波的能力有限&#xff0c;有人推荐我们试一试地震处理软件RadEx Pro。 两个中文文档“RadE…

7--Gradle进阶 - settings.gradle的文件说明

7--Gradle进阶 - settings.gradle的文件说明 前言 介绍 settings.gradle 文件之前&#xff0c;先来说明一下&#xff0c;settings.gradle 主要是用来多模块工程使用的。 所以我们先来创建一个多模块的工程。 多模块工程创建 1. 创建 root 工程 1.1 配置本地 Gradle 1.2 配置依赖…

一口总结了金九银十(P5-P7 级)1000 多道 Java 面试题,20+ 大厂必考点及 Java 面试框架知识点

Java 面试 “金九银十”这个字眼对于程序员应该是再熟悉不过的了&#xff0c;每年的金九银十都会有很多程序员找工作、跳槽等一系列的安排。说实话&#xff0c;面试中 7 分靠能力&#xff0c;3 分靠技能&#xff1b;在刚开始的时候介绍项目都是技能中的重中之重&#xff0c;它…

微服务架构基础--第2章初识SpringBoot

第2章初识SpringBoot 一.预习笔记 1.SpringBoot的定义&#xff1a; SpringBoot是由Pivotal团队提供的一个全新框架&#xff0c;是为了简化Spring应用的初始搭建过程和开发过程。 2.SpringBoot的优点 1&#xff09;可快速的构建独立Spring应用程序 2&#xff09;内嵌Servle…

​DMBOK知识梳理for CDGA/CDGP——第六章 数据存储与操作(附常考知识点)

第六章 数据存储与操作 第六章在CDGA|CDGP考试中的分值占比较少&#xff0c;知识点比较密集&#xff0c;主要考点包括&#xff1a;数据存储与操作的定义、目标、数据库管理员&#xff08;DBA&#xff09;的角色定位及类型、数据处理的类型ACID和BASE的区别、数据库环境、活动、…

探索工业智能检测,基于轻量级YOLOv5s开发构建焊接缺陷检测识别系统

前面也有讲过将智能模型应用和工业等领域结合起来是有不错市场前景的&#xff0c;比如&#xff1a;布匹瑕疵检测、瓷砖瑕疵检测、PCB缺陷检测等等&#xff0c;在工业领域内也有很多可为的方向&#xff0c;本文的核心目的就是想要基于目标检测模型来开发构建焊接缺陷检测模型&am…

基于opencv测量图片中物体的尺寸(matlab实现)

1、引言 问题重述 已知书本上右下角放一枚一元人民币&#xff08;直径2.5厘米&#xff09;&#xff0c;请利用计算机视觉技术预测图片中目标的实际尺寸。 1.预测图片中书本的长与宽&#xff08;单位&#xff1a;厘米&#xff09;。 2.预测书本右上方用铅笔画的圆圈的外圆直径…

Cocos Creator:AR 交互

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 Cocos Creator&#xff1a;AR 交互 3D工具集&#xff1a; NSDT简石数字孪生 AR 交互 AR 交互主要由 cc.ScreenTouchInteractor 组件驱动&#xff0c;该组件将触摸事件转换为点击、拖拽和捏合等手势&#xff0c;交互器将这…

SciencePub学术 | 信号处理类重点SCIEI征稿中

SciencePub学术 刊源推荐: 信号处理类重点SCI&EI征稿中&#xff01;影响因子高&#xff0c;自引率低&#xff0c;对国人非常友好。信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 信号处理类重点SCI&EI &#x1f4cc;【期刊简介】IF&#xff1…

RTK 定位回传数据转内网(局域网)mqtt协议--- 格林恩德 CR102 RTK 针对无人机巡检应用

先简单介绍一下CR102 格林RTK高精度设备&#xff0c;CR102接收机&#xff0c;集成高精度模组与4G&#xff0c; WIFI/蓝牙通信模组&#xff1b;双天线定位定向&#xff0c; 同时内置惯导&#xff0c; 输出加速度和姿态信息。支持4G/WIFI/蓝牙无线传输、 LAN网口传输&#xff1b;…

案例研究|中国矿业大学基于JumpServer构建运维安全体系

中国矿业大学是教育部直属的全国重点高校&#xff0c;是教育部、应急管理部与江苏省人民政府共建高校&#xff0c;先后进入国家“211工程”“985优势学科创新平台项目”和国家“双一流”建设高校行列&#xff0c;学校现坐落于素有“五省通衢”之称的国家历史文化名城——江苏省…

Java实训第七天——2023.6.13

文章目录 一、用Visual Studio Code写一个计算器二、同一个js被多个html引用三、js操作css四、DOM对象属性的操作案例五、js解析json 一、用Visual Studio Code写一个计算器 功能&#xff1a;实现简单的加减乘除 <!DOCTYPE html> <html lang"en"> <…