您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> MSSQL >> 求助一个group by 汇总的sql写法

求助一个group by 汇总的sql写法(1/2)

来源:网络整理     时间:2017/6/30 0:46:51     关键词:

关于网友提出的“ 求助一个group by 汇总的sql写法”问题疑问,本网通过在网上对“ 求助一个group by 汇总的sql写法”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 求助一个group by 汇总的sql写法
描述:

 求助一个group by 汇总的sql写法
通过左边的数据 汇总右边的表格.
求sql写法.越简练,效率高越好


解决方案1:


if object_id('tempdb..#Tmp_Data') is not null
drop table #Tmp_Data
CREATE TABLE #Tmp_Data (
             Check_Date  datetime ,
             Name nvarchar(20),
             Item_No nvarchar(20),
             Pass_Yn varchar(10))
             
Insert into #Tmp_Data
Select '2017-06-10',N'张三',N'项目1',N'是' union 
Select '2017-06-10',N'张三',N'项目2',N'否' union 
Select '2017-06-10',N'张三',N'项目3',N'是' union 
Select '2017-06-10',N'张三',N'项目4',N'是' union 
Select '2017-06-10',N'张三',N'项目5',N'是' union 
Select '2017-06-10',N'张三',N'项目6',N'是' union 
Select '2017-06-10',N'李四',N'项目1',N'是' union 
Select '2017-06-10',N'李四',N'项目2',N'是' union 
Select '2017-06-10',N'李四',N'项目3',N'否' union 
Select '2017-06-10',N'李四',N'项目4',N'是' union 
Select '2017-06-10',N'李四',N'项目5',N'是' union 
Select '2017-06-10',N'李四',N'项目6',N'是' union 
Select '2017-06-11',N'张三',N'项目1',N'是' union 
Select '2017-06-11',N'张三',N'项目2',N'是' union 
Select '2017-06-11',N'张三',N'项目3',N'是' union 
Select '2017-06-11',N'张三',N'项目4',N'是' union 
Select '2017-06-11',N'张三',N'项目5',N'是' union 
Select '2017-06-11',N'张三',N'项目6',N'是'  
--一个人在同一天, 如果一个项目不合格, 这个人的结果算为不合格
Select Check_Date,COUNT(distinct name) as name, 
       sum(case when cnt=2 then 0 else 1 end) as Pass,sum(case when cnt=2 then 1 else 0 end) as No_Pass
From (
 Select Check_Date,Name,count(*) as cnt 
 From ( 
Select Check_Date,Name,Pass_Yn 
From #Tmp_Data 
Group By Check_Date,Name,Pass_Yn
   )a
 Group By Check_Date,Name
  ) x
Group By Check_Date,cnt
Order BY Check_Date
解决方案2:

USE tempdb
GO
IF OBJECT_ID('test')  IS NOT NULL
DROP TABLE test
GO
CREATE TABLE test(日期 datetime,姓名 NVARCHAR(20),检查项目 nvarchar(20),是否合格 nchar(1))
SET NOCOUNT ON
INSERT INTO test(日期,姓名 ,检查项目 ,是否合格)
SELECT '2017-06-10','张三','项目1','是' union all
SELECT '2017-06-10','张三','项目2','否' union all
SELECT '2017-06-10','张三','项目3','是' union all
SELECT '2017-06-10','张三','项目4','是' union all
SELECT '2017-06-10','张三','项目5','是' union all
SELECT '2017-06-10','张三','项目6','是' union all
SELECT '2017-06-10','李四','项目1','是' union all
SELECT '2017-06-10','李四','项目2','是' union all
SELECT '2017-06-10','李四','项目3','是' union all
SELECT '2017-06-10','李四','项目4','否' union all
SELECT '2017-06-10','李四','项目5','是' union all
SELECT '2017-06-10','李四','项目6','是' union all
SELECT '2017-06-11','张三','项目1','是' union all
SELECT '2017-06-11','张三','项目2','是' union all
SELECT '2017-06-11','张三','项目3','是' union all
SELECT '2017-06-11','张三','项目4','是' union all
SELECT '2017-06-11','张三','项目5','是' union all
SELECT '2017-06-11','张三','项目6','是'
;WITH cte AS (
SELECT [日期]
,姓名
,SUM(CASE WHEN [是否合格]='是' THEN 1 ELSE 0 END) AS [合格] 
,sum(CASE WHEN [是否合格] != '是' then 1 else 0 end) AS [不合格] 
FROM test GROUP BY [日期],姓名
)
SELECT 日期,count(distinct 姓名) as 检查人数,
SUM(CASE WHEN 不合格>0 then 0 else 1 end) as 合格,
SUM(CASE WHEN 不合格>0 then 1 else 0 end) as 不合格
FROM cte GROUP BY 日期
/*
日期    检查人数 合格 不合格
2017-06-10 2      0     2
2017-06-11 1      1     0
*/

相关图片

相关文章