表A:   编号   数量    日期
         1     2    20090301
        2     5    20090302
        2     1    20090201
        3     2    20090101
        3     3    20090101
日期是一个开放条件(是一个时间段,如:20090201-200900301),
怎么样查询出比开放条件小的日期,所有相同编号的数量相加,
如开放条件选20090201-200900301),那么查处的就是:  编号  数量
                                                        2     1
                                                 3     5
我是这样写的 
select A.编号,数量=(select sum(B.数量)from 表A as B where B.日期<min(A.日期) and B.编号=A.编号 ) 
  FROM 表A as A  
提示:SQL语句内部错误 ,请问为什么啊。
开放条件是取:表A as A  这个表不能放子查询中。

解决方案 »

  1.   


    select 编号,sum(数量) 数量 from 表A where 日期<='20090201'
      

  2.   

    不太明白
    select 编号,sum(数量) 数量 from 表A where 日期<='20090201' group by 编号
      

  3.   

    --那就把'20090201'换成你的变量时间就可以了。
    select 编号,sum(数量) 数量 from 表A where 日期<='20090201' group by 编号
      

  4.   

    --那就把'20090201'换成你的变量时间就可以了。
    select 编号,sum(数量) 数量 from 表A where 日期<='20090201' group by 编号
      

  5.   

    有时候解决问题的关键是发现问题的关键,新手提出的问题往往模糊不清,让人产生误解。其实我觉得楼主的问题就是一个字符串拆分,并且做两次判断的问题。用户输入的值是“20090201-20090301”把它拆分开成两个字符串:“20090201”和“20090301”然后再把这两个字符串转成日期型,判断哪个最小。再把最小的做为条件,放入求和的查询语句中。楼主是不是这意思?你先明确这点,我再写SQL
      

  6.   

    恩,比如说我可以在前台直接对日期这个字段进行筛选,当我的条件是:日期<=20090301 且 日期>=20090201的时候,后台就对这个日期进行判断,单我输入其他条件时候又会对新的日期进行判断。
      

  7.   

    你是不会是会把这两个日期从前台传过来,把那个最小的日期,放到我写的那个脚本里不就可以了吗?
    --那就把'20090201'换成你的变量时间就可以了。
    select 编号,sum(数量) 数量 from 表A where 日期<=@小的日期 group by 编号
      

  8.   

    sdhdy估计要晕了。楼主的输入控件可能没办法判断日期的大小,所以没办法自动把最小日期传给脚本。比如我以前的报表日期就是这样录入的:从______ 到________用户可以输入:从 20090301 到 20090201也可以输入:从 20090201 到 20090301其实sdhdy的任务已经完成了。楼主你就自己辛苦下,写个程序把界面获取的日期数据判断一下,把最小的传给脚本。不是什么问题都能用脚本完成的。脚本这么神我们还用写UI做啥?
      

  9.   


    select 编号 , sum(数量) from tb where 日期 < 你给定的日期 group by 编号
      

  10.   

    --如果不知道哪个日期小,用case when 转换一下.create table tb(编号 int, 数量 int, 日期 datetime)
    insert into tb values(1 , 2 , '20090301') 
    insert into tb values(2 , 5 , '20090302') 
    insert into tb values(2 , 1 , '20090201') 
    insert into tb values(3 , 2 , '20090101') 
    insert into tb values(3 , 3 , '20090101')
    godeclare @dt1 as datetime
    declare @dt2 as datetime
    set @dt1 = '20090201'
    set @dt2 = '20090301'select 编号 , sum(数量) 数量 from tb where 日期 <= (case when @dt1 < @dt2 then @dt1 else @dt2 end) group by 编号drop table tb /*
    编号          数量          
    ----------- ----------- 
    2           1
    3           5(所影响的行数为 2 行)*/
      

  11.   

    老D不仅SQL语言经验丰富,连网友沟通的经验都很丰富,怪不得一天一千多分的涨。
      

  12.   

     @dt1 和 @dt2 我是开放同一个字段——日期,而且是一个时间段,不是一点我想到得办法就是判断最小值,不知道行不行,就像我刚开始写的那个意思,不知道那个语句能不能改进的。
      

  13.   

    declare @dt1 as datetime
    declare @dt2 as datetime
    set @dt1 = '20090201'
    set @dt2 = '20090301'这个不是时间点,而是代表从@dt1到@dt2,或者是从@dt2到@dt1,然后用case when转换你需要的最小值.
      

  14.   

    前端可以对  表A AS A 这个表的日期字段进行直接限制,不在SQL里面,也不是通过其他自定义字段,
      

  15.   

    我上面的做法就是用@dt1,@dt2这两个变量来获取你从前台输入的时间段.
      

  16.   


    你取最小的时间的话,不可能出现在 @dt1 , @dt2之间.
      

  17.   

    create table tb(编号 int, 数量 int, 日期 datetime)
    insert into tb values(1 , 2 , '20090301') 
    insert into tb values(2 , 5 , '20090302') 
    insert into tb values(2 , 1 , '20090201') 
    insert into tb values(3 , 2 , '20090101') 
    insert into tb values(3 , 3 , '20090101')
    godeclare @dt1 as datetime
    declare @dt2 as datetime
    set @dt1 = '20090201'
    set @dt2 = '20090301'select 编号 , sum(数量) 数量 from tb where 日期 <= (case when @dt1 > @dt2 then @dt1 else @dt2 end) group by 编号drop table tb 编号          数量
    ----------- -----------
    1           2
    2           1
    3           5(3 行受影响)那将它改小于号为大于号不就行了?
      

  18.   

    我晕哦,你到底要什么结果?取两个时间中间的?
    如果下面的还不对,你自己根据我的思路去取你需要的时间.create table tb(编号 int, 数量 int, 日期 datetime)
    insert into tb values(1 , 2 , '20090301') 
    insert into tb values(2 , 5 , '20090302') 
    insert into tb values(2 , 1 , '20090201') 
    insert into tb values(3 , 2 , '20090101') 
    insert into tb values(3 , 3 , '20090101')
    godeclare @dt1 as datetime
    declare @dt2 as datetime
    set @dt1 = '20090201'
    set @dt2 = '20090301'--取小于最小时间的。
    select 编号 , sum(数量) 数量 from tb where 日期 <= (case when @dt1 < @dt2 then @dt1 else @dt2 end) group by 编号
    /*
    编号          数量          
    ----------- ----------- 
    2           1
    3           5(所影响的行数为 2 行)
    */--取大于最大时间的。
    select 编号 , sum(数量) 数量 from tb where 日期 >= (case when @dt1 < @dt2 then @dt2 else @dt1 end) group by 编号
    /*
    编号          数量          
    ----------- ----------- 
    1           2
    2           5(所影响的行数为 2 行)
    */--取两个时间之间的。
    select 编号 , sum(数量) 数量 from tb where 日期 >= (case when @dt1 < @dt2 then @dt1 else @dt2 end) and 日期 <= (case when @dt1 < @dt2 then @dt2 else @dt1 end) group by 编号 
    /*
    编号          数量          
    ----------- ----------- 
    1           2
    2           1(所影响的行数为 2 行)
    */drop table tb 
      

  19.   

    create table tb(编号 int, 数量 int, 日期 datetime)
    insert into tb values(1 , 2 , '20090301') 
    insert into tb values(2 , 5 , '20090302') 
    insert into tb values(2 , 1 , '20090201') 
    insert into tb values(3 , 2 , '20090101') 
    insert into tb values(3 , 3 , '20090101')
    godeclare @dt1 as datetime
    declare @dt2 as datetime
    set @dt1 = '20090201'
    set @dt2 = '20090301'select 编号 , sum(数量) 数量 from tb where 日期 < (case when @dt1 < @dt2 then @dt1 else @dt2 end) and 编号 in
    (
      select distinct 编号 from tb where 日期 >= (case when @dt1 < @dt2 then @dt1 else @dt2 end) and 日期 <= (case when @dt1 < @dt2 then @dt2 else @dt1 end) 
    )
    group by 编号
    /*
    号          数量          
    ----------- ----------- (所影响的行数为 0 行)*/drop table tb