同志们我问个问题,我有两个表,分别是排班表和记录表,然后我要查询某月每一天的旷工次数,即排班表里排班了,但是记录表里没有这个人的记录,就在次数上+1,
CREATE proc  [dbo].[ooo]
@year int,
@month int --生成某月的数据
as
if @month<1 or @month >12
begin 
    raiserror('输入月份无效',16,1)
    return
end
else
begin
    create table #temp1(date datetime)
    declare @count int--得出该月有多少天
    declare @num int
    set @num=1
    set @count=
    case 
    when @month<12
    then
    datediff(dd,convert(varchar(10),cast(@year as varchar)+'-'+cast(@month as varchar)+'-01',120),convert(varchar(10),cast(@year as varchar)+'-'+cast((@month+1) as varchar)+'-01',120))
    else 
    datediff(dd,convert(varchar(10),cast(@year as varchar)+'-'+cast(@month as varchar)+'-01',120),convert(varchar(10),cast(@year+1 as varchar)+'-'+cast(1 as varchar)+'-01',120))
    end
    while(@num<=@count)
    begin
        insert into #temp1 select convert(varchar(10),cast(@year as varchar)+'-'+cast(@month as varchar)+'-'+cast(@num as varchar),120)
        set @num=@num+1
    end
    select a.date,COALESCE(count(b.pid),0)[count] from #temp1 a,Arg_Class b
full join record c  on b.pid=c.pid  where 
b.pid not in (select pid from record where datediff (day,inwell,a.date)=0)
group by a.date order by a.date
end我是这么写的,我现在能统计出来次数,但是比方说几天所有人都上班,次数为0,我查出来的记录就自动忽略了,这是怎么回事啊

解决方案 »

  1.   

    [b.pid not in (select pid from record where datediff (day,inwell,a.date)=0)
    ]
      

  2.   

    try this,    select a.date,COALESCE(count(b.pid),0) [count] 
        from #temp1 a, Arg_Class b
        left join record c on b.pid=c.pid  
        where b.pid not in 
        (select pid from record where datediff(day,inwell,a.date)=0)
        group by a.date 
        order by a.date
      

  3.   

    b.pid not in (select pid from record where datediff (day,inwell,a.date)=0)
    你这个语句过滤掉了你说的数据
      

  4.   

     with cte
     as
     (
        select a.date,b.*
        from
        #temp1 a left join Arg_Class b on a.date=b.inwell
     )
     
     select a.time,COUNT(b.pid)
     from
     cte a
     left join record b on b.pid=c.pid
     group by a.date 
     order by a.date
      

  5.   

    left,right。full。inner都试过了,此方法不可行
      

  6.   

    第一个with里面的语句是错误的,Arg_Class 没有inwell这个字段,record里面才有,然后我改成record之后就报错了
      

  7.   

    lz你确实使用left、full join什么的都没有用。
    你的时间表要和排班表进行左连接,然后在左连接你的记录表,这样的话才方便你的统计
    b.pid not in (select pid from record where datediff (day,record.m_time,a.m_time)=0)
    你的这句话过滤了很多数据
      

  8.   

    表结构和测试数据图片里就有啊,第一个表示Arg_Class ,第二个表是record,我在Arg_Class 先安排下井人员,然后在record查询我要查询的某月的每一天的下井记录,然后查询每天的旷工次数
      

  9.   

     with cte
     as
     (
        select a.date,b.*
        from
        #temp1 a left join Arg_Class b on a.date=b.settime
     )
     
     select a.time,COUNT(b.pid)
     from
     cte a
     left join record b on a.date=b.inWell and b.pid=c.pid
     group by a.date 
     order by a.date
      

  10.   

    再次说明一下,那个settime没啥用处,我主要是看我存储过程输入的时间和record的inwell对比,然后你这个还是报错了,消息 4104,级别 16,状态 1,过程 ooo,第 30 行
    无法绑定由多个部分组成的标识符 "c.pid"。
      

  11.   

    这样的查询一条sql就能搞定了。