当前位置: 代码迷 >> Sql Server >> 几个小问题感觉自己写的太复杂求上,有关问题请看上面,多谢!求高手,求拯救
  详细解决方案

几个小问题感觉自己写的太复杂求上,有关问题请看上面,多谢!求高手,求拯救

热度:13   发布时间:2016-04-27 11:34:49.0
几个问题感觉自己写的太复杂求高手指点下,问题请看下面,谢谢!求高手,求拯救
在几年的数据中查询查询某月员工的入、离职对照表怎么查,样式如下:

类型 在职人数 入职人数 入职比率 离职人数 离职比率

以类型分组
要查的某月以参数的形式限制 如:@YYDD=‘201201 '  

dbo.PerEmployee 表名

EmpStateName 类型 
InCumbency =1 时在职 =0 时不在职
ComeDate 入职日期
LeaverDate 离职日期  
要考虑当月某类型在职人数为0的类型
无数据库!!!

SQL code
DECLARE @YYDD Varchar(6)SET @YYDD='201201'Select EmpStateName, SUM(Case When InCumbency=1  Then 1 Else 0 End) ZaiZhiCount  --在职人数没限制月份                   , SUM(Case When CONVERT(Varchar(6), ComeDate, 112) = @YYDD  Then 1 Else 0 End) RuZhiCount  --入职人数                   , CONVERT(Varchar(6),(CASE WHEN  SUM(Case When CONVERT(Varchar(6), ComeDate, 112) = @YYDD Then 1 Else 0 End)=0                                                     THEN 0                                                     ELSE (CONVERT(Varchar(6),SUM(Case When CONVERT(Varchar(6), ComeDate, 112) = @YYDD   Then 1 Else 0 End)                                         *10000/(SUM(Case When InCumbency=1 Then 1 Else 0 End)*100))) END))+'%' RuZhiRate --入职比例                   , SUM(Case When CONVERT(Varchar(6), LeaveDate, 112) = @YYDD  Then 1 Else 0 End) LiZhiCount --离职人数                   , CONVERT(Varchar(6),(CASE WHEN SUM(Case When CONVERT(Varchar(6), LeaveDate, 112) = @YYDD                                                     And InCumbency=0 Then 1 Else 0 End)=0                                                    THEN 0                                                    ELSE (CONVERT(Varchar(6),SUM(Case When CONVERT(Varchar(6), LeaveDate,112) = @YYDD  Then 1  Else 0 End)                                        *10000/(SUM(Case When InCumbency=1 Then 1 Else 0 End)*100))) END))+'%' LiZhiRate --离职比例             From PerEmployee Group By EmpStateName/*EmpStateName   ZaiZhiCount      RuZhiCount    RuZhiRate     LiZhiCount       LiZhiRate正式工               4663        129             2%            267            5%NULL                249               0             0%               0            0%试用工                  0               0             0%               0            0%实习生                 69               0             0%             0            0%临时工                 12            0             0%             0            0%*/


问题如下:①当前百分比保留2为小数的形式显示,四舍五入
  [email protected]
  将上面的格式添加一行,如下显示:
EmpStateName ZaiZhiCount RuZhiCount RuZhiRate LiZhiCount LiZhiRate
正式工 4663 129 2.77% 267 5.73%
NULL 249 0 0.00% 0 0.00%
试用工 0 0 0.00% 0 0.00%
实习生 69 0 0.00% 0 0.00%
临时工 12 0 0.00% 0 0.00%
合计:

感觉自己写的太复杂求高手指点下,谢谢!



------解决方案--------------------
:①当前百分比保留2为小数的形式显示,四舍五入
cast(xx as desc(18,2))
[email protected]
where 条件后闲置
③将上面的格式添加一行,如下显示:
GROUP BY WITH ROLLUP
------解决方案--------------------
SQL code
DECLARE @YYDD VARCHAR(6)SET @YYDD = CONVERT(VARCHAR(6), GETDATE(), 112)SELECT  EmpStateName, SUM(CASE WHEN InCumbency = 1 THEN 1                               ELSE 0                          END) ZaiZhiCount  --在职人数没限制月份        , SUM(CASE WHEN CONVERT(VARCHAR(6), ComeDate, 112) = @YYDD THEN 1                   ELSE 0              END) RuZhiCount  --入职人数        , LTRIM(CONVERT(DECIMAL(9,2), ( CASE WHEN SUM(CASE WHEN CONVERT(VARCHAR(6), ComeDate, 112) = @YYDD THEN 1                                                   ELSE 0                                              END) = 0 THEN 0                                     ELSE ( CONVERT(VARCHAR(6), SUM(CASE WHEN CONVERT(VARCHAR(6), ComeDate, 112) = @YYDD THEN 1                                                                         ELSE 0                                                                    END) * 100.0 / ( SUM(CASE WHEN InCumbency = 1 THEN 1                                                                                              ELSE 0                                                                                         END)  )) )                                END ))) + '%' RuZhiRate --入职比例        , SUM(CASE WHEN CONVERT(VARCHAR(6), LeaveDate, 112) = @YYDD THEN 1                   ELSE 0              END) LiZhiCount --离职人数        , CONVERT(VARCHAR(6), ( CASE WHEN SUM(CASE WHEN CONVERT(VARCHAR(6), LeaveDate, 112) = @YYDD                                                        AND InCumbency = 0 THEN 1                                                   ELSE 0                                              END) = 0 THEN 0                                     ELSE ( CONVERT(VARCHAR(6), SUM(CASE WHEN CONVERT(VARCHAR(6), LeaveDate, 112) = @YYDD THEN 1                                                                         ELSE 0                                                                    END) * 10000 / ( SUM(CASE WHEN InCumbency = 1 THEN 1                                                                                              ELSE 0                                                                                         END) * 100 )) )                                END )) + '%' LiZhiRate --离职比例             FROM    PerEmployee--WHERE CONVERT(VARCHAR(6), ComeDate, 112)=CONVERT(VARCHAR(6), GETDATE(), 112)GROUP BY EmpStateNameWITH ROLLUP
  相关解决方案