我现在要做月报表 ,只有每天的数据来汇总成月报表。
     工作项目 第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.   

    create function dbo.GetWeekCount()
    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 行受影响)
      

  2.   


    --输入任意本年月份
    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 行受影响)
      

  3.   


    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
    以前写的一个、自己改下、
      

  4.   

    最好是使用SQL语句  因为我还要做别的处理操作  实在没办法的情况下才会考虑别的方法啦  谢谢  如果解决了 我会加分
      

  5.   


    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 行受影响)
      

  6.   

    但是结果输入还是有问题啊    除了2月份 每个月都是6周啊?
       还有 能不能直接Sql 语句 不要存储过程啊  好像要求有点多啊 呵呵
      

  7.   


    并且 
    select @weekcount=dbo.GetWeekCountNew(@month), --二月份周数,输入参数2,如:GetWeekCountNew(2)
    @weekStr='',@week = 0
    提示找不到聚合函数
      

  8.   

    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))
    )+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 行受影响)