sql 按照日期月份统计

非常巧妙的SQL统计,作者(嘿嘿,不是我哦)Jarry


SQL统计,按月分组统计,有时候有些月份没有数据, =============================================
-- 功能: 年度个人社保缴费清单
-- 作者: Jarry
-- 完成日期: 2008.3.13
-- =============================================
CREATE PROCEDURE [dbo].[proc_bg_SecurityYearPersonReport]
(
@Year nvarchar(4),
@StaffID int
)
AS
BEGIN
SELECT
(CONVERT(varchar,mMonth)+'月') AS 'Month',
b.CompanyPension,b.PersonPension,b.CompanyMedical,
b.PersonMedical,b.Maternity,b.WorkInjury,b.Unemployment
FROM
(SELECT 1 AS 'mMonth'
UNION SELECT 2 AS 'mMonth'
UNION SELECT 3 AS 'mMonth'
UNION SELECT 4 AS 'mMonth'
UNION SELECT 5 AS 'mMonth'
UNION SELECT 6 AS 'mMonth'
UNION SELECT 7 AS 'mMonth'
UNION SELECT 8 AS 'mMonth'
UNION SELECT 9 AS 'mMonth'
UNION SELECT 10 AS 'mMonth'
UNION SELECT 11 AS 'mMonth'
UNION SELECT 12 AS 'mMonth') m
LEFT JOIN
(
SELECT PayDate,sum(CompanyPension) CompanyPension,
sum(PersonPension) PersonPension,sum(CompanyMedical) CompanyMedical,
sum(PersonMedical) PersonMedical,sum(Maternity) Maternity,
sum(WorkInjury) WorkInjury,
sum(Unemployment) Unemployment FROM TB_Insurance
WHERE staID=@StaffID AND substring(cast(PayDate as nvarchar(6)),0,5)=@Year
GROUP BY PayDate
) b
on m.mMonth=convert(int,substring(convert(varchar,b.payDate),5,7))
END
GO
结果:

1月 NULL NULL NULL NULL NULL NULL NULL
2月 2345.00 236.00 2345.00 .00 .00 234.00 2345.00
3月 420.00 420.00 420.00 420.00 420.00 420.00 420.00
4月 NULL NULL NULL NULL NULL NULL NULL
5月 NULL NULL NULL NULL NULL NULL NULL
6月 NULL NULL NULL NULL NULL NULL NULL
7月 NULL NULL NULL NULL NULL NULL NULL
8月 .00 .00 .00 .00 .00 .00 .00
9月 NULL NULL NULL NULL NULL NULL NULL
10月 NULL NULL NULL NULL NULL NULL NULL
11月 NULL NULL NULL NULL NULL NULL NULL
12月 NULL NULL NULL NULL NULL NULL NULL


=================================================================================

-- =============================================
-- 功能: 年度社保费缴交人数及金额一览表
-- 作者: Jarry
-- 完成日期: 2008.3.13
-- =============================================
CREATE PROCEDURE [dbo].[proc_bg_SecurityYearCountReport]
(
@Year nvarchar(4)
)
AS
BEGIN
SELECT
(CONVERT(varchar,mMonth)+'月') AS 'Month',
b.Pension,b.PensionCount,b.Medical,
b.MedicalCount,b.Maternity,b.MaternityCount,
b.WorkInjury,b.WorkInjuryCount,b.Unemployment,b.UnemploymentCount
FROM
(SELECT 1 AS 'mMonth'
UNION SELECT 2 AS 'mMonth'
UNION SELECT 3 AS 'mMonth'
UNION SELECT 4 AS 'mMonth'
UNION SELECT 5 AS 'mMonth'
UNION SELECT 6 AS 'mMonth'
UNION SELECT 7 AS 'mMonth'
UNION SELECT 8 AS 'mMonth'
UNION SELECT 9 AS 'mMonth'
UNION SELECT 10 AS 'mMonth'
UNION SELECT 11 AS 'mMonth'
UNION SELECT 12 AS 'mMonth') m
LEFT JOIN
(
SELECT PayDate,sum(CompanyPension)+sum(PersonPension) Pension,
sum(case when CompanyPension+PersonPension>0 then 1 else 0 end) PensionCount,
sum(CompanyMedical)+sum(PersonMedical) Medical,
sum(case when CompanyMedical+PersonMedical>0 then 1 else 0 end) MedicalCount,
sum(Maternity) Maternity,
sum(case when Maternity>0 then 1 else 0 end) MaternityCount,
sum(WorkInjury) WorkInjury,
sum(case when WorkInjury>0 then 1 else 0 end) WorkInjuryCount,
sum(Unemployment) Unemployment,
sum(case when Unemployment>0 then 1 else 0 end) UnemploymentCount
FROM TB_Insurance
where substring(cast(PayDate as nvarchar(6)),0,5)=@Year
GROUP BY PayDate
) b
on m.mMonth=convert(int,substring(convert(varchar,b.payDate),5,7))
END
GO
达到如下效果

月 份 养 老 工 伤 医 疗 失 业 生 育
金 额 人 数 金 额 人 数 金 额 人 数 金 额 人 数 金 额 人 数
一月
二月
三月
四月
五月  
六月
七月
八月
九月
十月
十一月
十二月

注:此处日期字段是int型:200808,200810
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值