(
2010-8-27
记录)员工薪资历史
-Union
实现:
1、
表结构
Salary
(
id
,
empID
,
jbxz,yfxz,sfxz,jse
,
pid
)
Perion(id,bm,year,month,sdate,edate…)
表结构大体是这样的,其中
bm
是薪资日期编码如
2010-8
,但是不一定也可以是
108
,无规则可言。
Year
是薪资年,
month
是薪资月,
sdate
和
edate
是开始和结束日期。
2.
本来打算用交叉表实现的,原本已经用交叉表实现了,不过最后未能用交叉表实现“
xxxx
小计”,只能实现的显示“小计”,最后改用
union
方式实现。
3.
实现要点:
注意
group by
中的字段及顺序,注意
order by
中的字段及顺序
4
.代码如下:
/**
统计员工的期间薪资
*/
IF EXISTS (select * from sysobjects where id = object_id('sp_count_salary') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE sp_count_salary
GO
CREATE PROCEDURE sp_count_salary
@P_EMP_ID INT, --员工id
@P_SPLA_PER_ID INT, --开始期间id
@P_EPLA_PER_ID INT --结束期间id
WITH encryption
AS
BEGIN
BEGIN TRANSACTION T1
DECLARE @V_S_YEAR INT --开始期间年份
DECLARE @V_S_MONTH INT --开始期间月份
DECLARE @V_E_YEAR INT --结束期间年份
DECLARE @V_E_MONTH INT --结束期间月份
select @V_S_YEAR=pla_per_year,@V_S_MONTH=pla_per_month from pla_period where pla_per_id=@P_SPLA_PER_ID
select @V_E_YEAR=pla_per_year,@V_E_MONTH=pla_per_month from pla_period where pla_per_id=@P_EPLA_PER_ID
select (CAST(pla_per_year AS NVARCHAR(4)) + '-' + RIGHT('0' + CAST(pla_per_month AS NVARCHAR(2)), 2)) as '时间', sum(pay_res_btax) N'基本薪资',sum(pay_res_atax) N'应发薪资',sum(pay_res_result) N'实发薪资',sum(pay_res_tax) N'缴税额'
from pla_period pp,pay_res pr
where pp.pla_per_id = pr.pay_res_perid
and pay_res_empid = @P_EMP_ID
and (pla_per_year > @V_S_YEAR or (pla_per_year = @V_S_YEAR and pla_per_month >= @V_S_MONTH))
and (pla_per_year < @V_E_YEAR or (pla_per_year = @V_E_YEAR and pla_per_month <= @V_E_MONTH))
group by pla_per_year,pla_per_month
union
(
select cast(pla_per_year as varchar(10))+N'小计' as '时间', sum(pay_res_btax) N'基本薪资',sum(pay_res_atax) N'应发薪资',sum(pay_res_result) N'实发薪资',sum(pay_res_tax) N'缴税额'
from pla_period pp,pay_res pr
where pp.pla_per_id = pr.pay_res_perid
and pay_res_empid = @P_EMP_ID
and (pla_per_year > @V_S_YEAR or (pla_per_year = @V_S_YEAR and pla_per_month >= @V_S_MONTH))
and (pla_per_year < @V_E_YEAR or (pla_per_year = @V_E_YEAR and pla_per_month <= @V_E_MONTH))
group by pla_per_year
)
union
(
select N'合计' as '时间', sum(pay_res_btax) N'基本薪资',sum(pay_res_atax) N'应发薪资',sum(pay_res_result) N'实发薪资',sum(pay_res_tax) N'缴税额'
from pla_period pp,pay_res pr
where pp.pla_per_id = pr.pay_res_perid
and pay_res_empid = @P_EMP_ID
and (pla_per_year > @V_S_YEAR or (pla_per_year = @V_S_YEAR and pla_per_month >= @V_S_MONTH))
and (pla_per_year < @V_E_YEAR or (pla_per_year = @V_E_YEAR and pla_per_month <= @V_E_MONTH))
)
order by (CAST(pla_per_year AS NVARCHAR(4)) + '-' + RIGHT('0' + CAST(pla_per_month AS NVARCHAR(2)), 2))
IF @@ERROR > 0
BEGIN
ROLLBACK TRANSACTION T1
END
ELSE
BEGIN
COMMIT TRANSACTION T1
END
END
GO
--EXEC sp_count_salary 4901,1131,1153
- 大小: 88.9 KB
分享到:
相关推荐
例如,查询员工7839的当前工资、岗位以及历史工资和岗位,可以使用如下联合查询: ```sql SELECT sal, job FROM emp WHERE empno = 7839 UNION SELECT sal, job FROM emp_jobhistory WHERE empno = 7839; ``` ...
说明:用于连接到oracle数据库,也可实现用户的切换 用法:conn 用户名/密码 [as sysdba/sysoper] 注意:当用特权用户连接时,必须带上sysdba或sysoper 例子: 3. 断开连接(disc) 说明:断开与当前数据库的连接 ...
要查询所有工资高于5000的员工信息,可以使用如下SQL语句: ```sql SELECT * FROM Employees WHERE Salary > 5000; ``` #### SQL函数 除了基本的查询外,SQL还提供了丰富的内置函数,用于对数据进行更复杂的处理。 ...
4.2.1 UNION和UNION ALL 103 4.2.2 MINUS 106 4.2.3 INTERSECT 107 4.3 集合与空值 108 4.3.1 空值与非直观结果 108 4.3.2 集合运算中的空值行为 110 4.3.3 空值与GROUP BY和ORDER BY 112 4.3.4 空值与聚合...
实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的...
实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的...
实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的...
实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的...
第1章 窗体与界面设计 1 1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 5 实例005 可以拉伸...