现有一张表A,里面有每天的数据,例如:a0(日期),a1(公里),a2(米),我想实现日期之间的对比,
例如:
a0             a1     a2
2008-10-15    1488   100   (表示2008-10-15日1488公里内500米)
2008-10-15    1489   250   
2008-10-15    1490   120   
2008-10-15    1491   300   
2008-10-15    1492   250  
2008-9-15    1488    80   (表示2008-9-15日1488公里内80米)
2008-9-15    1489    230   
2008-9-15    1490    200   
2008-9-15    1491    250   
2008-9-15    1492    220  
现在要实现
   2008-9-15和2008-10-15之间的数据对比,并且把a2字段相差20米的记录列出来,我想写个SQL如何写啊,请各位高手指点,谢谢!!!

解决方案 »

  1.   

    SELECT a1,ABS(SUM(a2)) as Diffs
    (
        SELECT a1,a2*-1 as a2
        FROM A
        WHERE a0='2008-10-15'
        UNION ALL
        SELECT a1,a2*
        FROM A
        WHERE a0='2008-09-15'
    )tmp
    GROUP BY a1
    HAVING ABS(SUM(a2))=20
      

  2.   


    SELECT a1,ABS(SUM(a2)) as Diffs
    (
        SELECT a1,a2*-1 as a2
        FROM A
        WHERE a0='2008-10-15'
        UNION ALL
        SELECT a1,a2
        FROM A
        WHERE a0='2008-09-15'
    )tmp
    GROUP BY a1
    HAVING ABS(SUM(a2))=20
      

  3.   

    select case 
              when max(a2)-min(a2)>20 
              then datepart(y,a0),datepart(d,a0),a1 
           end
    from A
    group by 
           datepart(y,a0),datepart(d,a0),a1
      

  4.   

    --> 测试数据: @s
    declare @s table (a0 datetime,a1 int,a2 int)
    insert into @s
    select '2008-10-15',1488,100 union all
    select '2008-10-15',1489,250 union all
    select '2008-10-15',1490,120 union all
    select '2008-10-15',1491,300 union all
    select '2008-10-15',1492,250 union all
    select '2008-9-15',1488,80 union all
    select '2008-9-15',1489,230 union all
    select '2008-9-15',1490,200 union all
    select '2008-9-15',1491,250 union all
    select '2008-9-15',1492,220
    select * from @s a,@s b where datediff(mm,a.a0,b.a0)=1 and a.a1=b.a1 and abs(a.a2-b.a2)=20
      

  5.   

    select * from @s a inner join @s b on  datediff(mm,a.a0,b.a0)=1 and a.a1=b.a1 and abs(a.a2-b.a2)=20 and a.a0='2008-9-15'
      

  6.   

    declare @tb table(a0 varchar(20),a1 int,a2 int)
    insert into @tb
    select '2008-10-15',    1488 , 100 union all
    select '2008-10-15',    1489 , 250 union all  
    select '2008-10-15',    1490 , 120 union all  
    select '2008-10-15',    1491 , 300 union all  
    select '2008-10-15',    1492 , 250 union all  
    select '2008-9-15',    1488 ,   80 union all  
    select '2008-9-15',    1489 ,   230 union all  
    select '2008-9-15',    1490 ,   200 union all  
    select '2008-9-15',    1491 ,   250 union all  
    select '2008-9-15',    1492 ,   220  
    --select * from @tbselect a.*,b.a0 as a00,b.a1 as a11,b.a2 as a22 into #a from 
    (select * from @tb where a0='2008-10-15') a,
    (select * from @tb where a0='2008-9-15') b
    where a.a1=b.a1select * from #a
    select * from #a where abs(a22-a2)=20
    a0                   a1          a2          a00                  a11         a22         
    -------------------- ----------- ----------- -------------------- ----------- ----------- 
    2008-10-15           1488        100         2008-9-15            1488        80
    2008-10-15           1489        250         2008-9-15            1489        230
    2008-10-15           1490        120         2008-9-15            1490        200
    2008-10-15           1491        300         2008-9-15            1491        250
    2008-10-15           1492        250         2008-9-15            1492        220(所影响的行数为 5 行)a0                   a1          a2          a00                  a11         a22         
    -------------------- ----------- ----------- -------------------- ----------- ----------- 
    2008-10-15           1488        100         2008-9-15            1488        80
    2008-10-15           1489        250         2008-9-15            1489        230(所影响的行数为 2 行)