表t1中字段有 姓名,月份,工资tom 200605 1000
john 200605 2900
tom 200604 800
john 200604 3500
。现在要生成另一表t2 姓名,月份,工资涨降
结果应该象:john 200605 -600 (2900-3500)
tom 200605 200
。。
--------------------------------
请问大虾们,这个语句该怎么写啊?
john 200605 2900
tom 200604 800
john 200604 3500
。现在要生成另一表t2 姓名,月份,工资涨降
结果应该象:john 200605 -600 (2900-3500)
tom 200605 200
。。
--------------------------------
请问大虾们,这个语句该怎么写啊?
解决方案 »
- Sql if , 取不到数据
- 这段sql server有几个主键?
- SQL Server2000在XP sp2下安装错误!(还有100分)
- 求SQL
- 好奇怪,web.config中<membership>的一问题
- 保存记录集为XML的问题 请zjcxc(邹建)进来看一下
- 第一次进入 。。。
- SQL server 和JSP问题,虚心求教
- exec在复杂语句中加单引号'的问题
- 请问我使用backup备份的MSSQL数据库备份的文件(如abc.dat)为什么在硬盘上找不到?我如何将它copy到别的机器上再恢复?
- 棘手问题,SQL server 的mmc.exe错误, 不能做数据库维护计划和导出数据。
- 有句SQL语句不知如何写?我用等于是可以的,不等于就出错了!
insert into #t
select 'tom',200605,1000 union all
select 'john',200605,2900 union all
select 'tom',200604,800 union all
select 'john',200604,3500
select
姓名,
月份,
工资-(select top 1 工资 from #t where 姓名=a.姓名 and 月份<a.月份) as 工资涨降,
'(' + cast(工资 as varchar(100)) + '-' + (select top 1 cast(工资 as varchar(100)) from #t where 姓名=a.姓名 and 月份<a.月份) + ')' as 计算过程
from #t a
where 月份=200605
drop table #t/*
姓名 月份 工资涨降 计算过程
------------------------------------------------------------
tom 200605 200 (1000-800)
john 200605 -600 (2900-3500)*/
select top 1 工资 from #t where 姓名=a.姓名 and 月份<a.月份
改为
select top 1 工资 from #t where 姓名=a.姓名 and 月份<a.月份 order by 月份 desc
好一点。
insert into #t
select 'tom',200605,1000 union all
select 'john',200605,2900 union all
select 'tom',200604,800 union all
select 'john',200604,3500
select
姓名,
月份,
工资-(select top 1 工资 from #t where 姓名=a.姓名 and 月份<a.月份 order by 月份 desc) as 工资涨降,
'(' + cast(工资 as varchar(100)) + '-' + (select top 1 cast(工资 as varchar(100)) from #t where 姓名=a.姓名 and 月份<a.月份 order by 月份 ) + ')' as 计算过程
from #t a
where 月份=200605
drop table #t/*
姓名 月份 工资涨降 计算过程
------------------------------------------------------------
tom 200605 200 (1000-800)
john 200605 -600 (2900-3500)*/
declare @t table(姓名 varchar(10),月份 int ,工资 money)
insert into @t select 'tom',200605,1000
union all select 'john',200605,2900
union all select 'tom',200604,800
union all select 'john',200604,3500;--查询WITH CTE_T1(姓名,月份,工资)
AS
(
SELECT * FROM @t A
WHERE NOT EXISTS (SELECT 1 FROM @T WHERE 姓名=A.姓名 AND 月份>A.月份)
),
CTE_T2(姓名,月份,工资)
AS
(
SELECT * FROM @t A
WHERE NOT EXISTS (SELECT 1 FROM @T WHERE 姓名=A.姓名 AND 月份=A.月份-1)
)
select 姓名=a.姓名,月份=a.月份,工资涨降=a.工资-b.工资 from CTE_T1 a ,CTE_T2 b
where a.姓名=b.姓名
/*
结果
姓名 月份 工资涨降
---------- ----------- ---------------------
tom 200605 200.00
john 200605 -600.00(2 行受影响)
*/
select a.姓名,a.月份,(a.工资-(select top 1 工资 from @t where a.姓名=姓名 and a.月份>月份 order by 工资))as 工资涨降,('('+cast(a.工资 as varchar(100))+'-'+cast((select top 1 工资 from @t where a.姓名=姓名 and a.月份>月份 order by 工资)
as varchar(100))+')') as 计算过程 from @t a where a.月份=200605
大家可能都有工资条吧。
工资条上肯定有很多项,我这有24项。我要建立每个人(考虑某月新人加入)每个月每项的变化,你们说我的sql语句该有多长啊?我不需要“计算过程”列。
因此,恳请大家帮我出出主意。
(姓名 varchar(10),
月份 int,
工资 int)insert into #t
select 'tom',DATEDIFF(mm,'1753-1-1','2005-1-1'),1000 union all
select 'tom',DATEDIFF(mm,'1753-1-1','2005-2-1'),1100 union all
select 'tom',DATEDIFF(mm,'1753-1-1','2005-3-1'),1300 union all
select 'tom',DATEDIFF(mm,'1753-1-1','2005-4-1'),1700 union all
select 'join',DATEDIFF(mm,'1753-1-1','2005-1-1'),1000 union all
select 'join',DATEDIFF(mm,'1753-1-1','2005-2-1'),800 union all
select 'join',DATEDIFF(mm,'1753-1-1','2005-3-1'),1200 union all
select 'join',DATEDIFF(mm,'1753-1-1','2005-4-1'),1700
select
a.姓名,
DATENAME(yy,DATEADD(mm,a.月份,'1753-1-1'))+DATENAME(mm,DATEADD(mm,a.月份,'1753-1-1')) 月份1,
DATENAME(yy,DATEADD(mm,b.月份,'1753-1-1'))+DATENAME(mm,DATEADD(mm,b.月份,'1753-1-1')) 月份1,
b.工资 - a.工资 工资涨降,
'('+cast (a.工资 as nvarchar(100)) + '-' +cast (b.工资 as nvarchar(100))+')' 计算过程
from #t a
inner join #t b ON a.姓名 = b.姓名 and a.月份 = b.月份-1
order by a.姓名,a.月份 desc
drop table #t姓名 月份1 月份1 工资涨降 计算过程
---------- ---------- ---------- ----------- -------------
join 200503 200504 500 (1200-1700)
join 200502 200503 400 (800-1200)
join 200501 200502 -200 (1000-800)
tom 200503 200504 400 (1300-1700)
tom 200502 200503 200 (1100-1300)
tom 200501 200502 100 (1000-1100)
再根据结果判断是正值还是负值,而使用不同颜色的brush填写此项
insert into #t
select 'tom',200605,1000 union all
select 'john',200605,2900 union all
select 'tom',200604,800 union all
select 'john',200604,3500
select
姓名,
月份,
工资-(select top 1 工资 from #t where 姓名=a.姓名 and 月份<a.月份) as 工资涨降,
'(' + cast(工资 as varchar(100)) + '-' + (select top 1 cast(工资 as varchar(100)) from #t where 姓名=a.姓名 and 月份<a.月份) + ')' as 计算过程
from #t a
where 月份=200605
yuefen varchar(10),
gz int
)insert t select 'tom','200506',3000
insert t select 'john','200505',2500
insert t select 'tom','200505',2800
insert t select 'john','200506',3200
select
a1.name,a1.yuefen,a2.yuefen,(a1.gz-a2.gz) 升降
from
t a1
join
t a2
on
a1.gz>=a2.gz
and
a1.name=a2.name
where
(a1.gz-a2.gz)>0