我现在要做月报表 ,只有每天的数据来汇总成月报表。
工作项目 第1周 第2周 第3周 第4周 第5周 小计
日常工作 0 8.5 11 13 32.5
人事管理 0 0 0 0 0
招聘管理 0 0 0 0 0
绩效管理 0 0 0 0 0
培训管理 0 0 0 0 0
薪酬管理 14 26.5 24 22 86.5
专项工作 0 0 0 0 0
出差 0 0 0 0 0
就是星期天为一个星期的开始。所以可能会有一个月出现6周的情况。 如果这个月的开始是星期五,也默认是一周。最后一个星期的星期六,那么也默认为是一周。 请我这种SQL语句应该如何实现?谢谢
工作项目 第1周 第2周 第3周 第4周 第5周 小计
日常工作 0 8.5 11 13 32.5
人事管理 0 0 0 0 0
招聘管理 0 0 0 0 0
绩效管理 0 0 0 0 0
培训管理 0 0 0 0 0
薪酬管理 14 26.5 24 22 86.5
专项工作 0 0 0 0 0
出差 0 0 0 0 0
就是星期天为一个星期的开始。所以可能会有一个月出现6周的情况。 如果这个月的开始是星期五,也默认是一周。最后一个星期的星期六,那么也默认为是一周。 请我这种SQL语句应该如何实现?谢谢
Returns int as
--依据
--select dateadd(mm, datediff(mm,0,getdate()), 0) --所在当月第一天
--select dateadd(ms,-3,dateadd(mm, datediff(m,0,getdate())+1, 0)) --所在当月最后一天
--所在当月天数
begin
declare @weekCount int
--本月应有周数
set @weekCount=datediff(
day, dateadd(mm, datediff(mm,0,getdate()), 0),
dateadd(ms,-3,dateadd(mm, datediff(m,0,getdate())+1, 0))
)/7
--按照逻辑判断
if datepart(dw, dateadd(mm, datediff(mm,0,getdate()), 0))<>1 set @WeekCount=@WeekCount+1
if datepart(dw, dateadd(ms,-3,dateadd(mm, datediff(m,0,getdate())+1, 0))) <> 1 set @WeekCount=@WeekCount+1
return(@weekCount)
end
--举例
select dbo.GetWeekCount()
--结果
-----------
5(1 行受影响)
--输入任意本年月份
alter function dbo.GetWeekCountNew(@Month int)
Returns int as
--所在当月天数
begin
declare @weekCount int, @CalDate datetime
set @CalDate=cast(datepart(year,getdate()) as varchar) + '-' + right('0'+cast(@month as varchar),2)+'-01'
--本月应有周数
set @weekCount=datediff(
day, dateadd(mm, datediff(mm,0,@CalDate), 0),
dateadd(ms,-3,dateadd(mm, datediff(m,0,@CalDate)+1, 0))
)/7
--按照逻辑判断
if datepart(dw, dateadd(mm, datediff(mm,0,@CalDate), 0))<>1 set @WeekCount=@WeekCount+1
if datepart(dw, dateadd(ms,-3,dateadd(mm, datediff(m,0,@CalDate)+1, 0))) <> 1 set @WeekCount=@WeekCount+1
return(@weekCount)
end
--举例
select dbo.GetWeekCountNew(2)
--结果
-----------
5(1 行受影响)
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go-- =============================================
-- Author: MALE
-- Create date: 2011-1-19
-- Description: 每月转账手续费结算
-- =============================================
ALTER PROCEDURE [dbo].[usp_JobPutTransfer]
AS
declare @MemberId int --MemberId
declare @ADTotal float --天使币转账手续费
declare @oldAD float --当前余额 declare @Getdate datetime --当前日期
set @Getdate=getdate()
declare @Getdate1 datetime --上个月的最后一天
-- set @Getdate1 = Convert(datetime,Convert(varchar(10),datepart(year,dateadd(day,-1,getdate())))+'-'+
-- Convert(varchar(10),datepart(month,dateadd(day,-1,getdate())))+'-'+
-- Convert(varchar(10),datepart(day,dateadd(day,-1,getdate())))+' 23:59:59') set @Getdate1 = dateadd(mm,datediff(mm,0,getdate()),-1)+' 23:59:59'
--事务开始
BEGIN TRAN
--发放转账手续费 declare myCursor cursor for
SELECT a.memberid,sum(moneydetail)*-1 as ADTotal from
(SELECT dbo.ADMember.MemberId, dbo.ADMember.Status, dbo.MoneyDetail.ArmId, dbo.MoneyDetail.DealSign, dbo.MoneyDetail.MoneyDate,
dbo.MoneyDetail.MoneyType, dbo.MoneyDetail.MoneyDetail
FROM dbo.ADMember INNER JOIN
dbo.MoneyDetail ON dbo.ADMember.MemberId = dbo.MoneyDetail.ArmId
WHERE moneytype = 209 and dealsign = 0 and datediff(month,moneydate,getdate())=1 --条件为上个月
)a
WHERE status = 1
GROUP BY a.memberid OPEN myCursor
FETCH next FROM myCursor INTO @MemberId,@ADTotal
WHILE @@fetch_status = 0
BEGIN
--加钱
SELECT @oldAD = AD FROM MemberMoney
WHERE MemberId = @MemberId --余额 UPDATE memberMoney SET AD=AD+@ADTotal
WHERE memberId = @MemberId
if @@error<>0
BEGIN ROLLBACK
RETURN END
--财务明细插入数据
INSERT INTO moneydetail VALUES(@MemberId,@ADTotal,@oldAD+@ADTotal,212,
'System',@Getdate1,'<Names><cn>每月转账费结算</cn><en>Transfer Fee Monthly</en></Names>'
,2,0,null,0)
if @@error<>0
BEGIN ROLLBACK
RETURN END
fetch next from myCursor into @MemberId,@ADTotal
END
deallocate myCursor --更新状态
update moneydetail set dealsign = 1
where moneytype=209 and datediff(Month,moneydate,getdate())=1 --上个月
if @@error<>0
BEGIN ROLLBACK
RETURN END
COMMIT TRAN
以前写的一个、自己改下、
create function dbo.GetWeekCountNew(@Month int)
Returns int as
--所在当月天数
begin
declare @weekCount int, @CalDate datetime
set @CalDate=cast(datepart(year,getdate()) as varchar) + '-' + right('0'+cast(@month as varchar),2)+'-01'
--本月应有周数
set @weekCount=datediff(
day, dateadd(mm, datediff(mm,0,@CalDate), 0),
dateadd(ms,-3,dateadd(mm, datediff(m,0,@CalDate)+1, 0))
)/7
--按照逻辑判断
if datepart(dw, dateadd(mm, datediff(mm,0,@CalDate), 0))<>1 set @WeekCount=@WeekCount+1
if datepart(dw, dateadd(ms,-3,dateadd(mm, datediff(m,0,@CalDate)+1, 0))) <> 1 set @WeekCount=@WeekCount+1
return(@weekCount)
end--写成存储过程
create procedure GetWeekShow
@month int
asdeclare @weekcount int,@week int, @weekStr varchar(300)select @weekcount=dbo.GetWeekCountNew(@month), --二月份周数,输入参数2,如:GetWeekCountNew(2)
@weekStr='',@week = 0while @week<>@weekcount
begin
set @week=@week+1
set @weekStr=@weekStr + ' (select ''' +
case @week when 1 then '第一周' when 2 then '第二周' when 3 then '第三周'
when 4 then '第四周' when 5 then '第五周' when 6 then '第六周'
end + ''' as ['+cast(@week as varchar)+']) as '+ char(96+@week) + ','
endset @weekStr='select * from '+left(@weekstr,len(@weekstr)-1)exec(@weekstr)
--------------------------------------
---举例调用exec GetWeekShow 1
----结果
1 2 3 4 5 6
------ ------ ------ ------ ------ ------
第一周 第二周 第三周 第四周 第五周 第六周(1 行受影响)
还有 能不能直接Sql 语句 不要存储过程啊 好像要求有点多啊 呵呵
并且
select @weekcount=dbo.GetWeekCountNew(@month), --二月份周数,输入参数2,如:GetWeekCountNew(2)
@weekStr='',@week = 0
提示找不到聚合函数
alter function dbo.GetWeekCountNew(@Month int)
Returns int as
--所在当月天数
begin
declare @weekCount int, @CalDate datetime
set @CalDate=cast(datepart(year,getdate()) as varchar) + '-' + right('0'+cast(@month as varchar),2)+'-01'
--本月应有周数
set @weekCount=(datediff(
day, dateadd(mm, datediff(mm,0,@CalDate), 0),
dateadd(ms,-3,dateadd(mm, datediff(m,0,@CalDate)+1, 0))
)+1)/7 + 1
--按照逻辑判断
if datepart(dw, dateadd(mm, datediff(mm,0,@CalDate), 0)) in (7) set @WeekCount=@WeekCount+1
if datepart(dw, dateadd(ms,-3,dateadd(mm, datediff(m,0,@CalDate)+1, 0))) in (1) set @WeekCount=@WeekCount+1
return(@weekCount)
end2/函数调用要加上前面的用户权限,如:select dbo.GetWeekCountNew(2)3/调用刚存储过程结果--以3月为例
exec GetWeekShow 3----结果
1 2 3 4 5
------ ------ ------ ------ ------
第一周 第二周 第三周 第四周 第五周(1 行受影响)