表Meeting
ID,Name,StartDate,EndDate表Attendee(与会人员住宿登记,InDate入住日期,OutDate退房日期,可以中途退房或入住)
ID,Name,InDate,OutDate,Meeting_ID现在要列出每个会议每天的参加人数(暂定所有会议均为5天)最好是列出:Meeting_ID,Meeting_Name,Attendee1(第1天人数),Attendee2(第2天人数)...Attendee5(第5天人数)
其次是列出:
Meeting_ID1,Meeting_Name1,Attendee(第1天人数)
Meeting_ID1,Meeting_Name1,Attendee(第2天人数)
Meeting_ID1,Meeting_Name1,Attendee(第3天人数)
Meeting_ID1,Meeting_Name1,Attendee(第4天人数)
Meeting_ID1,Meeting_Name1,Attendee(第5天人数)
Meeting_ID2,Meeting_Name2,Attendee(第1天人数)
Meeting_ID2,Meeting_Name2,Attendee(第2天人数)
Meeting_ID2,Meeting_Name2,Attendee(第3天人数)
Meeting_ID2,Meeting_Name2,Attendee(第4天人数)
Meeting_ID2,Meeting_Name2,Attendee(第5天人数)
......
如果天数不定又该如何?     

解决方案 »

  1.   

    --最好是列出:M.Meeting_ID,M.Meeting_Name,Attendee1(第1天人数),Attendee2(第2天人数)...Attendee5(第5天人数) 
    select M.Meeting_ID, M.Meeting_Name, Attendee1=count(A1.Meeting_ID), Attendee2=count(A2.Meeting_ID),
    Attendee3=count(A3.Meeting_ID), Attendee4=count(A4.Meeting_ID), Attendee5=count(A5.Meeting_ID) 
    from Meeting M left join Attendee A1 on M.Meeting_ID=A1.Meeting_ID and M1.StartDate between A1.InDate and A1.OutDate
    left join Attendee A2 on M.Meeting_ID=A2.Meeting_ID and dateadd(day,1,M1.StartDate) between A2.InDate and A2.OutDate
    left join Attendee A3 on M.Meeting_ID=A3.Meeting_ID and dateadd(day,2,M1.StartDate) between A3.InDate and A3.OutDate
    left join Attendee A4 on M.Meeting_ID=A4.Meeting_ID and dateadd(day,3,M1.StartDate) between A4.InDate and A4.OutDate
    left join Attendee A5 on M.Meeting_ID=A5.Meeting_ID and dateadd(day,4,M1.StartDate) between A5.InDate and A5.OutDate
    group by M.Meeting_ID, M.Meeting_Name
      

  2.   

    那假如每个会议天数不定,但最多不超过一个数字,如50天呢?有没有其它写法?
    为此我特地加了一个辅助表,Days,只有1列,_day=1,2,3,4.....,能不能在这个思路上弄一个?
      

  3.   


    --每个会议第一天人数
    select a.meeting_id,rtrim(b.name)+'1' meeting_name,count(*) as attendee 
    from attendee a,metting b
    where a.meeting_id=b.id and b.startdate between a.indate and a.outdate
    group by a.metting_id,rtrim(b.name)+'1'同理每个会议第2-5天的人数可依此推
    如第2天,将+'1'改为+'2',将a.startdate加1再将5个查询结果用union all加起来却可
      

  4.   

    每个 meeting 5天的情况:
    select ID, Name, 
    (select Count(distinct ID)
     from Attendee
     where Meeting_ID = A.ID and Indate < A.StartDate 
    and OutDate > A.StartDate) as Attendee1,
    (select Count(distinct ID)
     from Attendee
     where Meeting_ID = A.ID and Indate < A.StartDate + 1 
    and OutDate > A.StartDate + 1) as Attendee2,
    (select Count(distinct ID)
     from Attendee
     where Meeting_ID = A.ID and Indate < A.StartDate + 2 
    and OutDate > A.StartDate + 2) as Attendee3,
    (select Count(distinct ID)
     from Attendee
     where Meeting_ID = A.ID and Indate < A.StartDate + 3 
    and OutDate > A.StartDate + 3) as Attendee4,
    (select Count(distinct ID)
     from Attendee
     where Meeting_ID = A.ID and Indate < A.StartDate + 4 
    and OutDate > A.StartDate + 4) as Attendee5
    from Meeting
      

  5.   

    如果天数不确定,用一个 @sql varchar(8000) 动态查询,看能不能查询出,原理应该差不多吧。
    不知道正不正确,仅供参考下。
      

  6.   

    对任意天
    创建一临时表,用while 语句
    各天人数的查询语句用动态生成
     用insert into 临时表 exec(动态sql语句)
    将结果插入到临时表中
    再对临时表查询.
      

  7.   


    --不知道这是不是你要的样式和结果
    --创建表
    CREATE TABLE MEETING(ID INT,NAME VARCHAR(20),STARTDATE VARCHAR(20),ENDDATE VARCHAR(20))
    INSERT INTO MEETING
    SELECT 1,'十六大','2007-10-01','2007-10-05'
    UNION ALL SELECT 2,'十七大','2007-10-15','2007-10-20'CREATE TABLE ATTENDEE(ID INT,NAME VARCHAR(20),INDATE VARCHAR(20),OUTDATE VARCHAR(20),MEETING_ID INT)
    INSERT INTO ATTENDEE
    SELECT 1,'张大','2007-10-01','2007-10-03',1
    UNION ALL SELECT 2,'张二','2007-10-02','2007-10-05',1
    UNION ALL SELECT 3,'张三','2007-10-03','2007-10-03',1
    UNION ALL SELECT 4,'张四','2007-10-01','2007-10-05',1
    UNION ALL SELECT 5,'张五','2007-10-04','2007-10-05',1
    UNION ALL SELECT 6,'张六','2007-10-03','2007-10-05',1
    UNION ALL SELECT 7,'王大','2007-10-02','2007-10-05',1
    UNION ALL SELECT 8,'王二','2007-10-15','2007-10-15',2
    UNION ALL SELECT 9,'王三','2007-10-17','2007-10-20',2
    UNION ALL SELECT 10,'王田','2007-10-15','2007-10-20',2
    UNION ALL SELECT 11,'王五','2007-10-19','2007-10-20',2
    UNION ALL SELECT 12,'李云','2007-10-18','2007-10-19',2
    UNION ALL SELECT 13,'马五','2007-10-15','2007-10-17',2
    UNION ALL SELECT 14,'李玉','2007-10-16','2007-10-16',2
    UNION ALL SELECT 15,'刘云','2007-10-16','2007-10-20',2--插入临时表
    select  bh=identity( int,0,1) ,* into #tbl from attendee--查询
    select tb.meeting_id ,ta.name,tb.sj,count(*) '人数' from(select a.*,
       convert(varchar(10),dateadd(day,b.bh,a.indate),120)sj
    from attendee a,#tbl b
    where datediff(day,dateadd(day,b.bh,a.indate),a.outdate)>=0
    )tb inner join meeting ta
    on ta.id=tb.meeting_id and tb.sj between ta.startdate and ta.enddate
     
    group by tb.sj,tb.meeting_id,ta.name
    --删除
    drop table #tbl,meeting,attendee
      

  8.   

    不好意思,好久没来了。
    问题以解决。dobear_0922 的方法需要加count(distinct id),但速度似乎不理想。
    Lyw110 的方法比较好,但是这个distinct似乎可以省掉。