首页 > 数据库 >SqlServer使用GroupBy分组时, 设置当查询不到某个分组时, 默认赋值一个0

SqlServer使用GroupBy分组时, 设置当查询不到某个分组时, 默认赋值一个0

时间:2024-02-03 12:33:21浏览次数:43  
标签:语句 when SqlServer 查询 State 分组 GroupBy SELECT

现在有个需求, 需要将分组查询并统计个数后返回数据,但是当数据中没有对应的分组时就查询不到对应的数据, 比如使用下面的Sql语句查询(State为Table1的字段,值为int类型)

点击查看代码
select 
	 case State
		when 0 then '开工'
		when 1 then '等待'
		when 2 then '完工'
		when -2 then '待审核'
		when -1 then '驳回'
		end as 状态,
		count(Autoid) as 订单数量 
	from Table1  group by State
go

使用上面的语句查询得到的结果如图, 可以看出统计出来的只有开工、等待和完工, 没有待审核和驳回的数据,因为表内没有这两个状态的数据, 现在需要当没有数据时显示订单数量为0

image

优化一下Sql语句

点击查看代码
WITH StateTable AS (
	SELECT -2 AS State UNION ALL
	SELECT -1 UNION ALL
	SELECT 0 UNION ALL
	SELECT 1 UNION ALL
	SELECT 2
)
SELECT 
    case st.State
		when 0 then '开工'
		when 1 then '等待'
		when 2 then '完工'
		when -2 then '待审核'
		when -1 then '驳回'
		end as 订单状态,
    COALESCE(COUNT(ji.id), 0) AS 订单数量
FROM StateTable st
LEFT JOIN JOBINFO ji ON st.State = ji.State and CONVERT(varchar, ji.PlanDateTime, 120) LIKE '%2023-%'
GROUP BY st.State;

以上的sql语句((这里加多了一个条件,查询PlanDateTime是2023年的数据),解释一下:这个SQL语句首先使用WITH子句创建了一个临时表StateTable,包含了所有可能的State值(-2、-1、0、1、2)。然后,将StateTable与JOBINFO表进行左连接。接着使用CASE语句将State值转换为对应的中文描述。最后,使用COALESCE函数将NULL值替换为0,并按照State分组统计id的数量。下面就是运行的结果

image

标签:语句,when,SqlServer,查询,State,分组,GroupBy,SELECT
From: https://www.cnblogs.com/AkaiL/p/18004524

相关文章

  • C#之linq和lamda表达式GroupBy分组拼接字符串
    业务需求:点击提示信息,如:“售后单【SH001】序列号【001,002,006】;售后单【SH002】序列号【003,007,009】。已经过了质保期,确认要继续关闭吗” 核心代码://lamda表达式varerrorMsgObj=getNoPay.GroupBy(s=>s["FBILLNO"]+"").Select(d=>new{......
  • sqlserver特性,自动忽略字符串末尾的空格
    实测发现在sqlserver中查询语句,数据字段末尾存在空格用等于号也可以查询出来例如whereCarNumber=‘粤A23435’和whereCarNumber='粤A23435’查询出来的结果一样,sqlserver会忽视字符串末尾的空格 原因:空字符和空格都不占用存储空间,SQLServer默认其是相等的。结果都是......
  • sqlserver SQLServer Profiler 模板制作和导入
    SQLServerProfiler是一个基于图形界面的工具,用于监视和分析SQLServer数据库系统的活动。目录一、使用标准模板追踪数据库服务器SQL二、制作模板三、导出模板四、将模板文件导入新的客户端五、在新的客户端修改配置和使用模板 使用标准模板追踪数据库服务器SQL ......
  • c# linq-to-sql 连接sqlserver数据库
    在已有项目下,点击新建项: 输入服务器名称:详见sqlserver登录页,如下所示:其中服务器名称、登录名、密码一一对应。且登录名必须为sa 接着选择连接的数据库名称-》点击测试连接,测试是否正常连接数据库。点击确认完成创建。 完成增删改查操作代码示例:///<summary>///......
  • python连接mysql8、sqlserver2012
    python连接mysql比较顺利,网上很多代码,连接sqlserver的例子少,且很多错误,尝试很多帖子,最后成功代码如下。#连接mysqlimportpymysqldefconn():try:connection=pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='cl&#......
  • SQL PARTITION BY 语句把一张表分组后的最大值或最小值插入另一张表里
    1.例子见前一章,目的是有分组的,只显示OrderAmount最高的(即每组只显示一列) 2.再建一个表来存储CREATETABLE[dbo].[MaxOrders]([orderid][int]NULL,[Orderdate][date]NULL,[CustomerName][varchar](100)NULL,[Customercity][varchar](100)NULL,......
  • 12.分组并发压测实战
    1.压测计划制定压测策略不同的并发数10,50,100,200,……持续时间30s记录结果测试期望结果验证能够支撑多大并发数,峰值数验证错误率,定义可接受范围,<=0.1%or<=0.5%ormust=0%2.压测策略通过对比并发数与流量还有错误率的关系,找到一个最合理的系统可支撑最......
  • SQLServer 字符集的学习与验证
    SQLServer字符集的学习与验证背景因为开发JDBCforSQLServer的一群大佬自作主张的进行了AsUnicode的默认参数值设置.导致数据库采用了varchar的列到出现了隐式转换,有非常大的性能损耗.单独改过来又担心出现乱码的问题(毕竟这个比较2的选项就是为了解决乱码问题)没办......
  • 软件测试学习笔记丨JMeter_实现分组并发
    Jmeter_实现分组并发实现思路:线程数和时间进行参数化,使用命令模式进行执行,再添加报告进行每次展示。执行时可以使用linux定时器或者脚本调用。命令执行命令启动jmeter命令:jmeter-Jpara1=4-Jpara2=15-n-tpreClassMenu_1117.jmx-le:/res/res1.jtl-e-oe:/res/res/......
  • 【数据库】对大数据量数据集,PostgreSQL分组统计数量,使用 row_number() over
    在处理大数据量数据集时,我们经常需要进行分组统计。而在PostgreSQL中,我们可以使用row_number()函数结合over(partitionby)子句来实现这个功能。同时,通过设置row_num<=100的条件,我们可以限定每组最多数量为100。本文将详细介绍如何使用这种方法进行分组统计。一、row_......