有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
直接对Accident 表按照 AccidentGradeID AccidentTypeID 进行group,然后在把结果和另外两张表关联。
第一步就是:
SELECT AccidentTypeID,AccidentGradeID FROM dbo.Accidents GROUP BY AccidentTypeID,AccidentGradeID
然后和另外两张表关联,不太懂~啊,
@大叔、: 如果你要按月统计,group by的时候还要有月份字段。
实际上你是有按天统计的需求,所以我建议你按天group by
SELECT AccidentTypeID,AccidentGradeID, [Data], Count(0) as AccidentCount FROM dbo.Accidents GROUP BY AccidentTypeID, AccidentGradeID, [Date]
以上sql能够查询出,每天的各种类型、各种级别的事故总数。
@幻天芒: 哦,谢谢,现在有一个问题,我用EF调用存储过程,怎么接收数据?百度查的都是还要造个类,那我执行存储过程,返回21个字段,那就是得建21个字段么?有没有说可以不见类,拿到数据,遍历输出就行??
var list = _dbContext.Database.SqlQuery<GetResult>("EXEC Proc_AccidentDaily @SAccidentType", STypeParam);
比如说这种,就得建一个 GetResult 类。。
@大叔、: dynamic~
@幻天芒: 大神,再问你一个
这个用sql语句怎么查这些结果。按月搜索的。然后显示该月每天隐患数量。
@大叔、: 这个可以直接用C#进行数据变换。(列转行)
我去,你是在做哪个项目?怎么跟我几年前做的一模一样。
我新手!~ 第一次做这种输出。。
@大叔、: 我说的是表名,字段这些内容相同
@Engineer: 哦,我们公司是做安全系统的,你有用过openxml 做word合并么?? 输出表单的
@大叔、: 没有用过
@Engineer: 嗯 好的~
百度下,sql数据透视表 或者 sql 交叉表
这个问题主要在行和列都是字典上
首先,行数据需要使用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
当月累计的话,大概就是日期条件变变而已