现有五月销售表saleinfo201205,表里有:
vipcardno(会员卡号),saleno(流水号),sstotal(销售金额),xsdate(销售时间)现在要会员单笔流水低于1000且是第一次消费的记录也就是要最小时间,单笔流水低于1000的
怎么样又能按这个vipcardno分组求小xsdate,还能按saleno分组求sstotal总额
我都快哭死了,整了好久,求高手垂怜!!!

解决方案 »

  1.   

    create table saleinfo201205(
    vipcardno varchar(20),saleno varchar(20),sstotal float,xsdate datetime)
    insert into  saleinfo201205 values('101','1',600,'2012-01-01')
    insert into  saleinfo201205 values( '102','1',500,'2012-01-02')
    insert into  saleinfo201205 values( '103','1',400,'2012-01-03')
    insert into  saleinfo201205 values( '101','2',600,'2012-01-02')
    insert into  saleinfo201205 values( '101','3',600,'2012-01-03')
    insert into  saleinfo201205 values( '101','4',600,'2012-01-04')
    insert into  saleinfo201205 values( '105','1',1200,'2012-01-01')
    insert into  saleinfo201205 values( '105','2',600,'2012-01-03')select * from saleinfo201205 a where exists(select 1 from (
    select vipcardno,min(xsdate) as xsdate from saleinfo201205 group by vipcardno)b where a.xsdate=xsdate and a.vipcardno=vipcardno )
    and sstotal<1000101 1 600 2012-01-01 00:00:00.000
    102 1 500 2012-01-02 00:00:00.000
    103 1 400 2012-01-03 00:00:00.000
      

  2.   

    测试数据:
    vipcardno SaleNo xsdate sstotal
    580872 2012050115126642 2012-05-01 20:44:08.000 598.00
    580874 2012051915037170 2012-05-19 16:14:32.000 54.00
    580876 2012052605248185 2012-05-26 11:28:45.000 0.30
    580876 2012052605248185 2012-05-26 11:28:45.000 9.90
    580876 2012052605248185 2012-05-26 11:28:45.000 27.20
    580876 2012052605248185 2012-05-26 11:28:45.000 6.70
    580876 2012052605248185 2012-05-26 11:28:45.000 9.60
    580876 2012052605248185 2012-05-26 11:28:45.000 9.60
    580876 2012052605248185 2012-05-26 11:28:45.000 6.04
    580876 2012052605248186 2012-05-26 11:29:46.000 3.36
    580876 2012052605248186 2012-05-26 11:29:46.000 18.03
    580876 2012052605248186 2012-05-26 11:29:46.000 22.90
    580876 2012052605248186 2012-05-26 11:29:46.000 53.90
    580883 2012050311015023 2012-05-03 14:20:11.000 299.00
    580883 2012050311015032 2012-05-03 14:33:55.000 150.00要的结果:
    vipcardno SaleNo xsdate sstotal
    580872 2012050115126642 2012-05-01 20:44:08.000 598.00
    580874 2012051915037170 2012-05-19 16:14:32.000 54.00
    580876 2012052605248185 2012-05-26 11:28:45.000 167.53
    580883 2012050311015023 2012-05-03 14:20:11.000 299.00相同流水号SaleNo求和,同一个vipcardno,时间最小的一条记录显示
      

  3.   

    同一个流水号SaleNo算一笔,但是这一笔里可能有多个商品的销售
      

  4.   


    select vipcardno,saleno,sstotal,xsdate from(
    select 
    px=ROW_NUMBER()over(partition by vipcardno,saleno order by xsdate asc),*
    from tbl)t
    where vipcardno in(select vipcardno from(
    select vipcardno,COUNT(1) from tbl group by vipcardno having COUNT(1)=1)m)
    and px=1 and sstotal<=1000
      

  5.   

    select vipcardno,min(saleno) as saleno,sum(sstotal) as sstotal,xsdate from saleinfo201205 a where exists(select 1 from (
    select vipcardno,min(xsdate) as xsdate from saleinfo201205 group by vipcardno)b where a.xsdate=xsdate and a.vipcardno=vipcardno )
    group by vipcardno,xsdate having sum(sstotal)<1000
      

  6.   

    应该是这样:
    测试数据:
    vipcardno SaleNo xsdate sstotal
    580872 2012050115126642 2012-05-01 20:44:08.000 598.00
    580874 2012051915037170 2012-05-19 16:14:32.000 54.00
    580876 2012052605248185 2012-05-26 11:28:45.000 0.30
    580876 2012052605248185 2012-05-26 11:28:45.000 9.90
    580876 2012052605248185 2012-05-26 11:28:45.000 27.20
    580876 2012052605248185 2012-05-26 11:28:45.000 6.70
    580876 2012052605248185 2012-05-26 11:28:45.000 9.60
    580876 2012052605248185 2012-05-26 11:28:45.000 9.60
    580876 2012052605248185 2012-05-26 11:28:45.000 6.04
    580876 2012052605248186 2012-05-26 11:29:46.000 3.36
    580876 2012052605248186 2012-05-26 11:29:46.000 18.03
    580876 2012052605248186 2012-05-26 11:29:46.000 22.90
    580876 2012052605248186 2012-05-26 11:29:46.000 53.90
    580883 2012050311015023 2012-05-03 14:20:11.000 299.00
    580883 2012050311015032 2012-05-03 14:33:55.000 150.00要的结果:
    vipcardno SaleNo xsdate sstotal
    580872 2012050115126642 2012-05-01 20:44:08.000 598.00
    580874 2012051915037170 2012-05-19 16:14:32.000 54.00
    580876 2012052605248185 2012-05-26 11:28:45.000 69.34--刚刚是我写错了
    580883 2012050311015023 2012-05-03 14:20:11.000 299.00相同流水号SaleNo求和,同一个vipcardno,时间最小的一条记录显示
      

  7.   

    create table saleinfo201205(
    vipcardno varchar(20),saleno varchar(20),sstotal float,xsdate datetime)
    truncate table saleinfo201205
    insert into  saleinfo201205 values('580872', '2012050115126642',598.00, '2012-05-01 20:44:08.000') 
    insert into  saleinfo201205 values('580874' ,'2012051915037170',54.00 ,'2012-05-19 16:14:32.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248185',0.30 ,'2012-05-26 11:28:45.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248185',9.90 ,'2012-05-26 11:28:45.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248185',27.20 ,'2012-05-26 11:28:45.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248185',6.70 ,'2012-05-26 11:28:45.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248185',9.60 ,'2012-05-26 11:28:45.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248185',9.60 ,'2012-05-26 11:28:45.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248185',6.04 ,'2012-05-26 11:28:45.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248186',3.36 ,'2012-05-26 11:29:46.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248186',18.03 ,'2012-05-26 11:29:46.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248186',22.90 ,'2012-05-26 11:29:46.000 ') 
    insert into  saleinfo201205 values('580876' ,'2012052605248186',53.90 ,'2012-05-26 11:29:46.000 ') 
    insert into  saleinfo201205 values('580883', '2012050311015023',299.00 ,'2012-05-03 14:20:11.000 ') 
    insert into  saleinfo201205 values('580883', '2012050311015032',150.00 ,'2012-05-03 14:33:55.000 ') select vipcardno,min(saleno) as saleno,sum(sstotal) as sstotal,xsdate from saleinfo201205 a where exists(select 1 from (
    select vipcardno,min(saleno) as saleno,sum(sstotal) as sstotal,min(xsdate) as xsdate from saleinfo201205 group by vipcardno)b where a.xsdate=xsdate and a.vipcardno=vipcardno )
    group by vipcardno,xsdate having sum(sstotal)<1000
      

  8.   


    --> 测试数据:[test]
    if object_id('[test]') is not null drop table [test]
    create table [test](
    [vipcardno] int,
    [SaleNo] bigint,
    [xsdate] datetime,
    [sstotal] numeric(8,2)
    )
    insert [test]
    select 580872,2012050115126642,'2012-05-01 20:44:08.000',598.00 union all
    select 580874,2012051915037170,'2012-05-19 16:14:32.000',54.00 union all
    select 580876,2012052605248185,'2012-05-26 11:28:45.000',0.30 union all
    select 580876,2012052605248185,'2012-05-26 11:28:45.000',9.90 union all
    select 580876,2012052605248185,'2012-05-26 11:28:45.000',27.20 union all
    select 580876,2012052605248185,'2012-05-26 11:28:45.000',6.70 union all
    select 580876,2012052605248185,'2012-05-26 11:28:45.000',9.60 union all
    select 580876,2012052605248185,'2012-05-26 11:28:45.000',9.60 union all
    select 580876,2012052605248185,'2012-05-26 11:28:45.000',6.04 union all
    select 580876,2012052605248186,'2012-05-26 11:29:46.000',3.36 union all
    select 580876,2012052605248186,'2012-05-26 11:29:46.000',18.03 union all
    select 580876,2012052605248186,'2012-05-26 11:29:46.000',22.90 union all
    select 580876,2012052605248186,'2012-05-26 11:29:46.000',53.90 union all
    select 580883,2012050311015023,'2012-05-03 14:20:11.000',299.00 union all
    select 580883,2012050311015032,'2012-05-03 14:33:55.000',150.00
    select distinct [vipcardno],[SaleNo],[xsdate],
    SUM([sstotal])over( partition by [SaleNo]) as [sstotal]
    from test a
    where [xsdate]=(select MIN([xsdate]) from test b 
    where a.vipcardno=b.vipcardno)/*
    vipcardno SaleNo xsdate sstotal
    580872 2012050115126642 2012-05-01 20:44:08.000 598.00
    580874 2012051915037170 2012-05-19 16:14:32.000 54.00
    580876 2012052605248185 2012-05-26 11:28:45.000 69.34
    580883 2012050311015023 2012-05-03 14:20:11.000 299.00
    */
    --哎,给的测试数据时间都是一样的
      

  9.   


     
    with cte as 
    (
    select '580872' as vipcardno,'2012050115126642' as SaleNo,'2012-05-01 20:44:08.000' as xsdate,598.00 as sstotal union all 
    select '580874','2012051915037170','2012-05-19 16:14:32.000',54.00 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',0.30 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',9.90 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',27.20 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',6.70 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',9.60 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',9.60 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',6.04 union all 
    select '580876','2012052605248186','2012-05-26 11:29:46.000',3.36 union all 
    select '580876','2012052605248186','2012-05-26 11:29:46.000',18.03 union all 
    select '580876','2012052605248186','2012-05-26 11:29:46.000',22.90 union all 
    select '580876','2012052605248186','2012-05-26 11:29:46.000',53.90 union all 
    select '580883','2012050311015023','2012-05-03 14:20:11.000',299.00 union all 
    select '580883','2012050311015032','2012-05-03 14:33:55.000',150.00
    )
    select
    distinct 
    vipcardno
    ,min(SaleNo) over(partition by vipcardno) as min_saleNo
    ,min(xsdate) over(partition by vipcardno) as min_xsdate
    ,sum(sstotal) over(partition by xsdate) as sum_sstotal
    from cte 
    where sstotal <1000--vipcardno min_saleNo       min_xsdate              sum_sstotal
    ----------- ---------------- ----------------------- ---------------------------------------
    --580872    2012050115126642 2012-05-01 20:44:08.000 598.00
    --580874    2012051915037170 2012-05-19 16:14:32.000 54.00
    --580876    2012052605248185 2012-05-26 11:28:45.000 69.34
    --580876    2012052605248185 2012-05-26 11:28:45.000 98.19
    --580883    2012050311015023 2012-05-03 14:20:11.000 150.00
    --580883    2012050311015023 2012-05-03 14:20:11.000 299.00--(6 row(s) affected)
    楼主给的测试结果是不是有问题?
    你的结果里 167.53和299.00 一个是汇总一个时根据时间取值
      

  10.   

    where sstotal <1000看上去都不对,是相同流水求和之后低于1000
      

  11.   


     
    with cte as 
    (
    select '580872' as vipcardno,'2012050115126642' as SaleNo,'2012-05-01 20:44:08.000' as xsdate,598.00 as sstotal union all 
    select '580874','2012051915037170','2012-05-19 16:14:32.000',54.00 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',0.30 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',9.90 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',27.20 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',6.70 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',9.60 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',9.60 union all 
    select '580876','2012052605248185','2012-05-26 11:28:45.000',6.04 union all 
    select '580876','2012052605248186','2012-05-26 11:29:46.000',3.36 union all 
    select '580876','2012052605248186','2012-05-26 11:29:46.000',18.03 union all 
    select '580876','2012052605248186','2012-05-26 11:29:46.000',22.90 union all 
    select '580876','2012052605248186','2012-05-26 11:29:46.000',53.90 union all 
    select '580883','2012050311015023','2012-05-03 14:20:11.000',299.00 union all 
    select '580883','2012050311015032','2012-05-03 14:33:55.000',150.00
    ),
    cte2 as
    (
    select
    distinct 
    a.vipcardno
    ,min(a.SaleNo) over(partition by vipcardno) as min_saleNo
    ,min(a.xsdate) over(partition by vipcardno) as min_xsdate
    ,sum(a.sstotal)over(partition by vipcardno) as sum_sstotal
    from cte  a
    where a.xsdate in 
    (
    --同一条记录,显示时间最小的...
    select MIN (xsdate) from cte b where b.vipcardno=a.vipcardno
    )
    )
    --过滤汇总后结果<1000
    select * from cte2 where sum_sstotal<1000--vipcardno min_saleNo       min_xsdate              sum_sstotal
    ----------- ---------------- ----------------------- ---------------------------------------
    --580872    2012050115126642 2012-05-01 20:44:08.000 598.00
    --580874    2012051915037170 2012-05-19 16:14:32.000 54.00
    --580876    2012052605248185 2012-05-26 11:28:45.000 69.34
    --580883    2012050311015023 2012-05-03 14:20:11.000 299.00--(4 row(s) affected)
    参考TravyLee 的 
    加上个过滤条件
      

  12.   

    TravyLee是对的,苍天啊大地啊,我再次核对一次
      

  13.   

    对了,神人,我改怎么感谢你呢,TravyLee老大
    先膜拜三下
      

  14.   

    真是学无止境啊,谢谢TravyLee老大
      

  15.   

    TravyLee的貌似少了一个条件哦,低于1000的,数据填大于几个1000的就不对了