首页 新闻 会员 周边 捐助

请教各位大神sql语句

0
悬赏园豆:100 [已解决问题] 解决于 2016-01-24 16:16

有3张表,Accident 事故表。AccidentGrade 事故级别表。 AccidentType 事故类型表。

要求用sql语句算出事故次数。 Accident表里有 AccidentGradeID  AccidentTypeID

                                          当月累计次数

                 级别        重大事故   大事故   一般事故   合计

事故类型                   ()次     ()次    ()次

人身伤害事故             ()次     ()次    ()次

电力事故                   ()次     ()次    ()次

 

哪位大神会啊?小弟菜鸟。多表联查不行~~

问题补充:

 

小弟谢了一个垃圾代码,各位大神帮忙看看

create proc Proc_DataTest
as
 declare @accidenttypeID nvarchar(20) --传入事故类型ID
 declare @stype1 nvarchar(20)
 declare @stype2 nvarchar(20)
 declare @stype3 nvarchar(20)
 declare @stype4 nvarchar(20)
 declare @stype5 nvarchar(20)
 set @stype1=(select ID from AccidentGrade where name='重大事故')  --拿到事故等级
 set @stype2=(select ID from AccidentGrade where name='大事故')
 set @stype3=(select ID from AccidentGrade where name='一般事故')
 set @stype4=(select ID from AccidentGrade where name='轻微事故')
 set @stype5=(select ID from AccidentGrade where name='涉险事故')
 declare @sql nvarchar(max)
 declare @sql2 nvarchar(max)
 declare @sqla nvarchar(max)
 declare @sqlb nvarchar(max)
 declare @sqlc nvarchar(max)
 declare @sqld nvarchar(max)
 set @sql='select COUNT(AccidentGradeID) resut from Accident where AccidentTypeID='+@accidenttypeID  
 set @sqla=@sql+' and CONVERT(varchar(100),createdate,23) = CONVERT(varchar(100),GETDATE(),23)'--当天
 set @sqlb=@sql+' and convert(char(7),createdate,20)= convert(char(7),GETDATE(),20)'--本月
 set @sqlc=@sql+' and DATEPART(YEAR,createdate)= DATEPART(YEAR,getdate())'--本年
 set @sqld=@sql+' '--去年
 set @sql2='
 ('+@sqla+' and AccidentGradeID='+@stype1+')a,
 ('+@sqla+' and AccidentGradeID='+@stype2+')b,  
 ('+@sqla+' and AccidentGradeID='+@stype3+')c,  
 ('+@sqla+' and AccidentGradeID='+@stype4+')d,
 ('+@sqla+' and AccidentGradeID='+@stype5+')e,
 ('+@sqlb+' and AccidentGradeID='+@stype1+')f,
 ('+@sqlb+' and AccidentGradeID='+@stype2+')g,  
 ('+@sqlb+' and AccidentGradeID='+@stype3+')h,  
 ('+@sqlb+' and AccidentGradeID='+@stype4+')i,
 ('+@sqlb+' and AccidentGradeID='+@stype5+')j,
 ('+@sqlb+')k'  
 set @sql2='select * from '+@sql2
 exec sp_executesql @sql2

大叔、的主页 大叔、 | 初学一级 | 园豆:84
提问于:2016-01-22 20:57
< >
分享
最佳答案
0

直接对Accident 表按照 AccidentGradeID  AccidentTypeID 进行group,然后在把结果和另外两张表关联。

收获园豆:100
幻天芒 | 高人七级 |园豆:37207 | 2016-01-23 11:40

第一步就是:

SELECT AccidentTypeID,AccidentGradeID  FROM dbo.Accidents GROUP BY AccidentTypeID,AccidentGradeID

然后和另外两张表关联,不太懂~啊,

大叔、 | 园豆:84 (初学一级) | 2016-01-23 12:55

@大叔、: 如果你要按月统计,group by的时候还要有月份字段。

实际上你是有按天统计的需求,所以我建议你按天group by

SELECT AccidentTypeID,AccidentGradeID, [Data], Count(0) as AccidentCount  FROM dbo.Accidents GROUP BY AccidentTypeID, AccidentGradeID, [Date]

以上sql能够查询出,每天的各种类型、各种级别的事故总数。

幻天芒 | 园豆:37207 (高人七级) | 2016-01-23 13:13

@幻天芒: 哦,谢谢,现在有一个问题,我用EF调用存储过程,怎么接收数据?百度查的都是还要造个类,那我执行存储过程,返回21个字段,那就是得建21个字段么?有没有说可以不见类,拿到数据,遍历输出就行??

var list = _dbContext.Database.SqlQuery<GetResult>("EXEC Proc_AccidentDaily @SAccidentType", STypeParam);

比如说这种,就得建一个 GetResult 类。。

大叔、 | 园豆:84 (初学一级) | 2016-01-23 16:49

@大叔、: dynamic~

幻天芒 | 园豆:37207 (高人七级) | 2016-01-23 21:09

@幻天芒: 大神,再问你一个

这个用sql语句怎么查这些结果。按月搜索的。然后显示该月每天隐患数量。

大叔、 | 园豆:84 (初学一级) | 2016-01-24 16:45

@大叔、: 这个可以直接用C#进行数据变换。(列转行)

幻天芒 | 园豆:37207 (高人七级) | 2016-01-24 21:51
其他回答(3)
0

我去,你是在做哪个项目?怎么跟我几年前做的一模一样。

Engineer | 园豆:331 (菜鸟二级) | 2016-01-25 10:44

我新手!~ 第一次做这种输出。。

支持(0) 反对(0) 大叔、 | 园豆:84 (初学一级) | 2016-01-27 16:21

@大叔、: 我说的是表名,字段这些内容相同

支持(0) 反对(0) Engineer | 园豆:331 (菜鸟二级) | 2016-01-27 16:22

@Engineer: 哦,我们公司是做安全系统的,你有用过openxml 做word合并么?? 输出表单的

支持(0) 反对(0) 大叔、 | 园豆:84 (初学一级) | 2016-01-27 16:27

@大叔、: 没有用过

支持(0) 反对(0) Engineer | 园豆:331 (菜鸟二级) | 2016-01-27 16:27

@Engineer: 嗯  好的~

支持(0) 反对(0) 大叔、 | 园豆:84 (初学一级) | 2016-01-27 16:33
0

百度下,sql数据透视表 或者 sql 交叉表

Sunday* | 园豆:206 (菜鸟二级) | 2016-01-29 09:38
0

这个问题主要在行和列都是字典上

首先,行数据需要使用sum和groupby进行处理

然后,列需要使用case进行处理,行可以是动态的,但是列需要时静态的(也就是sql固定列名)

其次,如果是经常性需要查询哪天的数据,那么有一个方法是做一个sql代理每天把上一天的数据统计后放到一张固定的表里,以后做统计时直接从此表里获取结果

sql的话,大致是select sum(case  AccidentGrade when 1 then 1 else 0) as AccidentGrade1,----(重大事故)

sum(case  AccidentGrade when 2 then 1 else 0) as AccidentGrade2,---大事故

................

 from Accident where 日期字段= @日期参数 group by AccidentType

当月累计的话,大概就是日期条件变变而已

Zux | 园豆:495 (菜鸟二级) | 2016-02-01 11:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册