如何写这样的sql语句(Oracle): 
1.写出连续三个月有费用产生的用户 
 账单表结构: 
 user_id   bill_month  amount 
 20050101  200801      100.32 
 20050102  200801      60.99 
............................ 2. 写出在网日期(使用日期)三个月以上的用户 
   套餐表结构 
   user_id    apply_date   ...... 
   20050101    2008-01-01  ...... 
   20050102    2008-02-01  ....... 
   ...............................

解决方案 »

  1.   

    帮你顶一下1.假设bill_month是字符类型,如是日期类型在改条件。
    SELECT user_id,bill_month,amount FROM TABLE WHERE
    WHERE LAG(bill_month,1,0) over (partition by user_id order by user_id,bill_month)-bill_month=1
    AND LAG(bill_month,2,0) over (partition by user_id order by user_id,bill_month)-bill_month=2
    2.假设apply_date是日期类型
    SELECT user_id FROM (SELECT USER_ID,TO_CHAR(apply_date,'YYYY-MM') apply_date FROM TABLE
    GROUP BY USER_ID,apply_date) GROUP BY user_id HAVING COUNT(1)>=3写了个大概写法,未测试,不行的话,楼主提供详细建表SQL文和测试数据在帮你做。
      

  2.   

    非常感谢楼上,
    1.bill_month是字符类型。现在需要把bill_month当参数传进来。比如查询日期为200803,则需要查询出200712,200801,200802这三个月连续有费用产生的用户。如何改sql啊? 非常感谢。
      

  3.   

    就是bill_month-1,bill_month-2,bill_month-3这3个月吗?
    SELECT USER_ID FROM TABLE WHERE bill_month IN (200803-1,200803-2,200803-3) GROUP BY USER_ID
    HAVING COUNT(1)>=3
      

  4.   

    用了上面的sql跑了下,
    SELECT USER_ID FROM TABLE WHERE bill_month IN (200803-1,200803-2,200803-3) GROUP BY USER_ID 
    HAVING COUNT(1)> =3
    发现查不出数据来,但实际数据库里存在数据的,
      

  5.   

    山芋  200803-1,200803-2,200803-3
    这个意思是  传入的参数的值是  200803
    200803-1   表示这个参数   减  一个月SELECT USER_ID FROM TABLE WHERE bill_month IN (
    add_months(to_date('200803','yyyymm'),-1),
    add_months(to_date('200803','yyyymm'),-2),
    add_months(to_date('200803','yyyymm'),-3)
    )
     GROUP BY USER_ID
    HAVING COUNT(1)> =3