http://bbs.csdn.net/topics/390499367
问题跟着上个帖子.
先谢谢lzw_0736和denghui_li帮我解决上面这个难题。
现在是
根据按照 同一个标记,从最初的开始时间算起,
3个月以内同一个标记的算一组,下个日期依然按着个要求算,并标记出现次数的需求。
把数据
[sign] [date]
1 2012-01-01
1 2012-02-061 2012-05-03
1 2012-06-111 2012-09-012 2012-02-03
2 2012-04-19
2 2012-04-23分组为:
[sign] [date] [n]
1 2012-01-01 2
1 2012-05-03 2
1 2012-09-01 1
2 2012-02-03 3
现在又添加了新的需求,需要根据分组的结果反查询到对应的数据。
我想来想去,只发现一个方法:
就把原有的数据变成
[sign] [date]   [s_sign] [s_date] [s_n]
1 2012-01-01 1 2012-01-01 2
1 2012-02-06 1 2012-01-01 21 2012-05-03 1 2012-05-03 2
1 2012-06-11 1 2012-05-03 21 2012-09-01 1 2012-09-01 12 2012-02-03 2 2012-02-03 3
2 2012-04-19 2 2012-02-03 3
2 2012-04-23 2 2012-02-03 3查询的统计结果的时候 Select distinct  [s_sign] [s_date] [s_n]
详细的时候就查询 Select [sign] [date]  from t1 where [s_sign], [s_date], [s_n]但是我现在就是无法实现上面的格式,实验几个小时了
求救啊!!谢谢!

解决方案 »

  1.   

    http://bbs.csdn.net/topics/390501598
    分不够的话,可以到这里回复 呼
      

  2.   


    with t ([sign],[date]) as
     (
     select 1,'2012-01-01'
     union all
     select 1,'2012-02-06'
     union all
     select 1,'2012-05-03'
     union all
     select 1,'2012-06-11'
     union all
     select 1,'2012-09-01'
     union all
     select 2,'2012-02-03'
     union all
     select 2,'2012-04-19'
     union all
     select 2,'2012-04-23'
     )
     ,tGroup as
     (
     select [sign],min([date]) as [date] 
     from t
     group by [sign]
     )
    select a.*,10000*a.[sign]+ datediff(DAY,b.[date],a.[date])/90   gn
    from t a
    join tGroup b
    on a.[sign]=b.[sign] 
    order by a.[sign],a.[date]
    gn 即为分组号
      

  3.   

    with a1 ([sign],[date]) as--明細
    (
    select 1,'2012-01-01' union all
    select 1,'2012-02-06' union all
    select 1,'2012-05-03' union all
    select 1,'2012-06-11' union all
    select 1,'2012-09-01' union all
    select 2,'2012-02-03' union all
    select 2,'2012-04-19' union all
    select 2,'2012-04-23'
    )
    ,a2 ([s_sign],[s_date],[s_n]) as
    (
    select 1,'2012-01-01',2 union all
    select 1,'2012-05-03',2 union all
    select 1,'2012-09-01',1 union all
    select 2,'2012-02-03',3
    )
    select  *
    from a1 a
    inner join a2 b on a.[sign]=b.[s_sign] and DATEDIFF(day,b.[s_date],a.[date]) between 0 and 90
    order by 1,2
      

  4.   


    with tb([sign],[date])as(
    select 1,'2012-01-01' union
    select 1,'2012-02-06' union
    select 1,'2012-05-03' union
    select 1,'2012-06-11' union
    select 1,'2012-09-01' union
    select 2,'2012-02-03' union
    select 2,'2012-04-19' union
    select 2,'2012-04-23'),
    tc([sign],[date],[n])as(
    select 1,'2012-01-01',2 union
    select 1,'2012-05-03',2 union
    select 1,'2012-09-01',1 union
    select 2,'2012-02-03',3)
    select * from tb left join tc on datediff(month,tc.date,tb.date)between 0 and 3 and tb.sign=tc.sign是这样?