有如下需求,数据表TarOutput结结构为:
  开始日期 结束日期 各阶段每天目标值
ID StartDate EndDate    A     B    C    D    E    F
1 2010/5/17 2010/5/22  9000 8000 8000  8000  8500  9000
2 2010/5/24 2010/5/29  8500 7500 8000  8000  8500  9000
3 2010/5/31 2010/6/5   8000 8000 8000  8000  8500  8000
4 2010/6/7 2010/6/19   9000 8000 8000  8000  8500  9000
......开始日期 和 结束日期不会交叉,表TarOutput为预先设置,请问
如果我要查询任一时间段 比如 d1 = 2010/5/18 和 d2=2010/5/28 日期范围内各阶段总目标值(未设置日期,
其各阶段值默认为0 如2010/5/23日。
要统计出2010/5/18至2010/5/28各阶段每天目标值总和,这个SQL该如何实现?统计出2010/5/18至2010/5/28各阶段每天目标值(随意设定的)总和:即            5/18  5/19  5/20  5/21  5/22 5/23  5/24  5/25   5/26   5/27  5/28  
SUM(A)= 9000 +9000 +9000 +9000 +9000 + 0 + 8500 + 8500 + 8500 +8500+ 8500 = 87500
SUM(B)= 8000 +8000+8000 +8000 +8000 + 0 + 7500 + 7500 + 7500 +7500+ 7500 = 77500  
SUM(C)= 8000 +8000+8000 +8000 +8000 + 0 + 8000 + 8000 + 8000 +8000+ 8000 = 80000  
SUM(D)= 8000 +8000+8000 +8000 +8000 + 0 + 8000 + 8000 + 8000 +8000+ 8000 = 80000  
SUM(E)= 8500 +8500+8500 +8500 +8500 + 0 + 8500 + 8500 + 8500 +8500+ 8500 = 85000
SUM(F)= 9000 +9000 +9000 +9000 +9000 + 0 + 9000 + 9000 + 9000 +9000+ 9000 = 90000

解决方案 »

  1.   

    开始日期 和 结束日期不会交叉 指设定表 tarOutput时间段值不会有日期重叠情况;即每个日期各阶段
    数据唯一
      

  2.   

    就是要一个 A,B,C,D,E,F合计记录,分开日期 查询是好办的;
      

  3.   

    ??
    CREATE TABLE a_(ID INT, StartDate SMALLDATETIME, EndDate SMALLDATETIME, A INT, B INT, C INT, D INT, E INT, F INT)
    insert a_ select 1,'2010/5/17','2010/5/22',9000,8000,8000,8000,8500,9000
    union all select 2,'2010/5/24','2010/5/29',8500,7500,8000,8000,8500,9000
    union all select 3,'2010/5/31','2010/6/5',8000,8000,8000,8000,8500,8000
    union all select 4,'2010/6/7','2010/6/19',9000,8000,8000,8000,8500,9000DECLARE @a SMALLDATETIME,@b SMALLDATETIME,@C INT 
    SELECT @a='2010/5/18',@b='2010/5/28',@C=DATEDIFF(DAY,@A,@B)+1SELECT SUM(A) A,SUM(B) B,SUM(C) C,SUM(D) D,SUM(E) E,SUM(F) F FROM 
    A_ AA
    ,(SELECT DATEADD(DAY,NUMBER,@A) X FROM MASTER.DBO.spt_values sv WHERE TYPE='P' AND DATEADD(DAY,NUMBER,@A)<=@B)BB
    WHERE X BETWEEN STARTDATE AND ENDDATE--RESULT
    /*A           B           C           D           E           F           
    ----------- ----------- ----------- ----------- ----------- ----------- 
    87500       77500       80000       80000       85000       90000(所影响的行数为 1 行)*/