MS SQL 合并结果集并求和

简介:

业务情景:有这样一张表:其中Id列为表主键,Name为用户名,State为记录的状态值,Note为状态的说明,方便阅读。


需求描述:需要查询出这样的结果:某个人某种状态的记录数,如:张三,待审核记录数,审核中记录数,审核通过记录数;大概像这样:


解决方案:

1.建表和初始化测试数据: 

--1.建表语句
CREATE TABLE [dbo].[Content]
(
	[Id] [int] NULL,
	[Name]   [nvarchar](50) NULL,
	[State]  [int] NULL,
	[Note]   [nvarchar](50) NULL,
)  
GO
--2.初始化数据
INSERT INTO CONTENT VALUES(1,'张三',1,'待审核')
INSERT INTO CONTENT VALUES(2,'张三',2,'审核中')
INSERT INTO CONTENT VALUES(3,'张三',2,'审核中')
INSERT INTO CONTENT VALUES(4,'李四',1,'待审核')
INSERT INTO CONTENT VALUES(5,'李四',2,'审核中')
INSERT INTO CONTENT VALUES(5,'李四',3,'审核通过')</span>
2.查询语句:

SELECT NAME,
       SUM(审核通过) AS '审核通过',
       SUM(待审核) AS '待审核',
       SUM(审核中) AS '审核中'
FROM   (
           (
               SELECT NAME,
                      COUNT(*) AS '审核通过',
                      0 AS '审核中',
                      0 AS '待审核'
               FROM   CONTENT
               WHERE  [STATE] = 3
                      AND NAME IN ('张三', '李四')
               GROUP BY
                      NAME
           ) 
           
           UNION 
           
           (
               SELECT NAME,
                      0 AS '审核通过',
                      COUNT(*) AS '审核中',
                      0 AS '待审核'
               FROM   CONTENT
               WHERE  [STATE] = 2
                      AND NAME IN ('张三', '李四')
               GROUP BY
                      NAME
           ) 
           UNION 
           (
               SELECT NAME,
                      0 AS '审核通过',
                      0 AS '审核中',
                      COUNT(*) AS '待审核'
               FROM   CONTENT
               WHERE  [STATE] = 1
                      AND NAME IN ('张三', '李四')
               GROUP BY
                      NAME
           )
       )temp
GROUP BY
       NAME</span>

这里用到两个知识点:

1.UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

2.GROUP BY + 聚合函数(如SUM, COUNT, MAX, AVG等)统计数据。



目录
相关文章
|
4月前
|
SQL Oracle 关系型数据库
sql语句两个字段合并或者两个字段拼接显示
sql语句两个字段合并或者两个字段拼接显示
|
5月前
|
SQL Oracle 关系型数据库
选择适合您网站的 SQL 托管:MS SQL Server、Oracle、MySQL 和 MS Ac
如果您希望您的网站能够存储和检索数据,您的Web服务器应该能够访问使用SQL语言的数据库系统。以下是一些常见的SQL托管选项:
52 1
|
5月前
|
SQL 数据库
SQL JOIN 子句:合并多个表中相关行的完整指南
SQL LEFT JOIN关键字返回左表(table1)中的所有记录以及右表(table2)中的匹配记录。如果没有匹配,则右侧的结果为0条记录。
68 0
|
5月前
|
SQL Oracle 关系型数据库
选择适合您网站的 SQL 托管:MS SQL Server、Oracle、MySQL
如果您希望您的网站能够存储和检索数据,您的Web服务器应该能够访问使用SQL语言的数据库系统。以下是一些常见的SQL托管选项:
57 2
|
7月前
|
SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
29 0
|
9月前
|
SQL 消息中间件 关系型数据库
使用Flink SQL实现对连续的异常告警进行合并
使用Flink SQL实现对连续的异常告警进行合并
278 40
|
10月前
|
SQL 网络协议 Ubuntu
Docker安装MS SQL Server并使用Navicat远程连接
Docker安装MS SQL Server并使用Navicat远程连接
174 0
|
SQL 移动开发 BI
【SQL开发实战技巧】系列(二十二):数仓报表场景☞ 从分析函数效率一定快吗聊一聊结果集分页和隔行抽样实现方式
怎样对SQL查询结果集分页比较好、平时你用分析函数优化传统查询,所以你会不会认为分析函数一定比传统查询效率高?一个实验告诉你答案、我想对数据进行隔行抽样应该怎么实现?【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。分析查询的一个小建议,可能大家平时为了方便,用row_number做分页的比较多,但是在有些场景,这个效率真的挺低。
【SQL开发实战技巧】系列(二十二):数仓报表场景☞ 从分析函数效率一定快吗聊一聊结果集分页和隔行抽样实现方式
|
SQL 存储
【SQL系列】合并多个行集
【SQL系列】合并多个行集
104 0
|
SQL 存储 Oracle
【SQL系列】合并多个行集
【SQL系列】合并多个行集
142 0