读书人

高分寻觅报表用SQL语句,欢迎钻石赏光。

发布时间: 2012-03-29 12:53:12 作者: rapoo

高分寻觅报表用SQL语句,欢迎钻石赏光。邹老大有空么??谢谢!!
CREATE TABLE [dbo].[Sw_Users](--用户表
[id] [int] IDENTITY(1,1) NOT NULL,
[username] [varchar](20) NULL,--用户名不重复
[pwd] [varbinary](50) NULL,
[name] [varchar](10) NULL,--姓名(部门多可能重复)
[sex] [varchar](4) NULL,
[dept] [varchar](20) NULL,--部门名称
[job] [varchar](20) NULL,--职位(主任,副主任,职员,分公司主任)
[Tel] [varchar](10) NULL,
[Fax] [varchar](10) NULL,
[Email] [varchar](20) NULL,
[lishu] [int] NULL CONSTRAINT [DF_Sw_Users_lishu] DEFAULT ((0)),--职员隶属于本中心主任
[pid] [int] NULL CONSTRAINT [DF_users_pid] DEFAULT ((0)),
[Fettle] [varchar](4) NULL CONSTRAINT [DF_Sw_Users_Fettle] DEFAULT ( '正常 '),
[Roles] [varchar](10) NULL,
CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[Sw_Month](--月度考核表,每个月17个分公司的17个用户给4个中心的员工评分,每个中心一个主任,每位员工也要给除了自己以外的员工(包括其它中心的员工)打分,分别写入这个表
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](8) NULL,--被评分人姓名
[username] [nchar](20) NULL,--被评分人用户名(怕重复记录了用户名)
[dept] [nvarchar](20) NULL,--被评分人所在的中心名称
[assesstime] [int] NULL,--考核月份(如:200706)
[plans] [float] NULL,--考核项目1
[availability] [float] NULL,--考核项目2
[exercisable] [float] NULL,--考核项目3
[attitude] [float] NULL,--考核项目4
[quality] [float] NULL,--考核项目5
[efficiency] [float] NULL,--考核项目6
[explain] [nvarchar](50) NULL,
[communicate] [nvarchar](500) NULL,
[addtime] [smalldatetime] NULL CONSTRAINT [DF_Sw_Month_addtime] DEFAULT (getdate()),--记录添加时间
[addguy] [nvarchar](20) NULL,--考核人(打分的人的用户名)
[proportion] [int] NULL,--打分人所占的权重(随后详细解释)
CONSTRAINT [PK_Sw_Month] PRIMARY KEY CLUSTERED
(
[id] DESC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

每个人的每个考核项目最终得分=(17个分公司打分的平均分)×10%+本中心主任打分×50%+(其它三个中心主任打分的平均分)×10%+(本部门员工打分的平均分)×20%+(其它中心员工打分的平均分)×10%


在加入记录前我做过判断,每个打分人相对于被打分人的权重都记入了:proportion字段,50%就记录为:50.
就是以下六个考核项目:
[plans] [float] NULL,--考核项目1
[availability] [float] NULL,--考核项目2
[exercisable] [float] NULL,--考核项目3
[attitude] [float] NULL,--考核项目4
[quality] [float] NULL,--考核项目5
[efficiency] [float] NULL,--考核项目6

打分主体:
总公司市场部下属四个中心,有四名主任
17个分公司17个分公司市场部主任
4个部门员工本身

被打分主体:
4个部门员工本身

要求一个查询列出
姓名 项目1得分 项目2得分 项目3得分 项目4得分 项目5得分 项目6得分 6个项目总和



张三 4.5 3.9 4.5 2.3 4.5 19.7

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


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

所有员工平均分:... ... ... ... ... ... 平均总分


不知道我说清楚了没,数据库是sqlserver2005,不知道表结构是不是还算合理。

[解决办法]
另,楼主在月度考核表中使用用户名而不使用用户ID,可能会对统计汇总工作造成一定的问题

建议将用户名更换成用户ID
[解决办法]
[proportion] [int] NULL,--打分人所占的权重(随后详细解释)

每个人的每个考核项目最终得分=(17个分公司打分的平均分)×10%+本中心主任打分×50%+(其它三个中心主任打分的平均分)×10%+(本部门员工打分的平均分)×20%+(其它中心员工打分的平均分)×10%

在加入记录前我做过判断,每个打分人相对于被打分人的权重都记入了:proportion字段,50%就记录为:50.

------------------------------
这个公司跟权重挂上钩了吗?
[解决办法]
分几步来走:
1.利用GROUP BY 语句,统计出[17个分公司打分的平均分] [本中心主任打分] [其它三个中心主任打分的平均分] [本部门员工打分的平均分] [其它中心员工打分的平均分]
2.利用Case When语句对每个不同分类进行相应的计算(由于不清楚楼主分类的标准,在此仅做简单的说明)
Select assesstime,username,SUM(
Case when 分类= '17个分公司打分 ' then 考核1*0.1
when 分类= '本中心主任打分 ' then 考核1*0.5
when 分类= '其它三个中心主任打分 ' then 考核1*0.1
when 分类= '本部门员工打分 ' then 考核1*0.2
when 分类= '其它中心员工打分 ' then 考核1*0.1
END
),....... From Sw_Month Group By assesstime,username

语句不完整,请不要直接执行
[解决办法]
分几步来走:
1.利用GROUP BY 语句,统计出[17个分公司打分的平均分] [本中心主任打分] [其它三个中心主任打分的平均分] [本部门员工打分的平均分] [其它中心员工打分的平均分]
2.利用Case When语句对每个不同分类进行相应的计算(由于不清楚楼主分类的标准,在此仅做简单的说明)
Select assesstime,username,SUM(
Case when 分类= '17个分公司打分 ' then 考核1*0.1
when 分类= '本中心主任打分 ' then 考核1*0.5
when 分类= '其它三个中心主任打分 ' then 考核1*0.1
when 分类= '本部门员工打分 ' then 考核1*0.2
when 分类= '其它中心员工打分 ' then 考核1*0.1
END
),....... From Sw_Month Group By assesstime,username

语句不完整,请不要直接执
[解决办法]
每个人的每个考核项目最终得分=(17个分公司打分的平均分)×10%+本中心主任打分×50%+(其它三个中心主任打分的平均分)×10%+(本部门员工打分的平均分)×20%+(其它中心员工打分的平均分)×10%

-------------------------------------------------------
主要问题在于按照什么分组

因为有多个都是按10%计算,也就是权重一样,所以按照[proportion]分组是不行的,[proportion]字段就是冗余字段了

职位(主任,副主任,职员,分公司主任),这里有三个“主任”,那“本中心主任”、“其它三个中心主任”的职位是“主任”还是包括了其他的两个?(这个有满意的解释的话可以用职务分组)

关于用户表的字段
[lishu] [int] NULL CONSTRAINT [DF_Sw_Users_lishu] DEFAULT ((0)),--职员隶属于本中心主任
主任的[lishu]是自己还是什么?这个提问时区分“本中心主任”和“其它三个中心主任”的关键


ps:
总体感觉,楼主的设计抛开了组织架构,直接用用户之间的关系来表示上下级关系是这个语句很难写的重要原因



[解决办法]
select s.name,s.dept,
isnull(m.plans1,0)*0.1+isnull(n.plans2,0)*0.5+isnull(l.plans3,0)*0.1+isnull(k.plans4,0)*0.2+isnull(p.plans5,0)*0.1 as plans,


isnull(m.availability1,0)*0.1+isnull(n.availability2,0)*0.5+isnull(l.availability3,0)*0.1+isnull(k.availability4,0)*0.2+isnull(p.availability5,0)*0.1 as availability,
isnull(m.exercisable1,0)*0.1+isnull(n.exercisable2,0)*0.5+isnull(l.exercisable3,0)*0.1+isnull(k.exercisable4,0)*0.2+isnull(p.exercisable5,0)*0.1 as exercisable,
isnull(m.attitude1,0)*0.1+isnull(n.attitude2,0)*0.5+isnull(l.attitude3,0)*0.1+isnull(k.attitude4,0)*0.2+isnull(p.attitude5,0)*0.1 as attitude,
isnull(m.quality1,0)*0.1+isnull(n.quality2,0)*0.5+isnull(l.quality3,0)*0.1+isnull(k.quality4,0)*0.2+isnull(p.quality5,0)*0.1 as quality,
isnull(m.efficiency1,0)*0.1+isnull(n.efficiency2,0)*0.5+isnull(l.efficiency3,0)*0.1+isnull(k.efficiency4,0)*0.2+isnull(p.efficiency5,0)*0.1 as efficiency
from sw_users s
left join
(select username,avg(plans) as plans1,avg(availability) as availability1,avg(exercisable) as exercisable1,avg(attitude) as attitude1,avg(quality) as quality1,avg(efficiency) as efficiency1 from sw_month
where addguy in (select username from sw_users where job= '地市用户 ') and assesstime=200705 group by username) m on m.username=s.username
left join
(select username,plans as plans2,availability as availability2,exercisable as exercisable2,attitude as attitude2,quality as quality2,efficiency as efficiency2 from sw_month where proportion=50 and assesstime=200705) n on n.username=s.username
left join
(select username,avg(plans) as plans3,avg(availability) as availability3,avg(exercisable) as exercisable3,avg(attitude) as attitude3,avg(quality) as quality3,avg(efficiency) as efficiency3 from sw_month where addguy in (select username from sw_users where right(job,2)= '主任 ' ) and assesstime=200705 group by username) l on l.username=s.username
left join
(select username,avg(plans) as plans4,avg(availability) as availability4,avg(exercisable) as exercisable4,avg(attitude) as attitude4,avg(quality) as quality4,avg(efficiency) as efficiency4 from sw_month where addguy in (select username from sw_users where job= '职员 ') and proportion=20 and assesstime=200705 group by username) k on k.username=s.username
left join
(select username,avg(plans) as plans5,avg(availability) as availability5,avg(exercisable) as exercisable5,avg(attitude) as attitude5,avg(quality) as quality5,avg(efficiency) as efficiency5 from sw_month where addguy in (select username from sw_users where job= '职员 ') and proportion=10 and assesstime=200705 group by username) p on p.username=s.username
where s.job= '职员 '
order by s.pid desc

以上就是完美版本了,楼主测试一下。

读书人网 >SQL Server

热点推荐