id user_id  book_id   pub_date 
1   1001       1     2008-04-18
1   1001       2     2008-05-18
1   1001       2     2008-09-18
1   1001       1     2009-01-18 
2   1001       1     2009-01-20 
3   1001       2     2009-02-12 
4   1001       3     2009-03-11 
5   1001       4     2009-04-20 
6   1001       5     2009-05-20 
7   1001       6     2009-06-20 
8   1001       7     2009-07-01 9   1002       1     2009-01-20 
10  1002       2     2009-01-20 
11  1002       3     2009-01-20 
12  1002       3     2009-04-20 
13  1002       5     2009-05-20 
14  1002       6     2009-06-20 
15  1002       7     2009-07-01 以每年的9月份到次年8月份為一個周期,如時當前查詢時間處於1月份到8月份之間,就是查詢去年9月份開始至當前月的記錄,如果當前查詢時間處於9月份到12月之間,就查詢本年9月份至當前月的記錄。 按月份統計每個用戶在一個月內買了哪幾本書,將書ID綜計出來,該如何處理,謝謝大家幫幫忙,小弟受教了!舉例:今天是2009年7月1號,所以查詢時間段應該為 pub_date between '2008-09-01' and '2009-07-01'我想要的統計結果為:user_id 9月份 10月份 11月份 12月份 1月份 2月份 3月份 4月份 5月份 6月份 7月份 8月份 1001     2              1   2   3   4   5   6   7  1002                1,2,3        3   5   6   7

解决方案 »

  1.   

    1,2,3 :
    不知道POSTGRESQL是否有类似MYSQL的GROUP_CONCAT、ASA11的LIST函数,如果有则直接使用,如果没有,则用
    SQL+SP来解决,其它的用静态SQL语句生成交叉表就OK了。
      

  2.   

    謝謝wwwwb的關注,平時很少做有關數據庫的工作,這次也是初次接觸PostgreSQL,所以我也不太清楚。to:ACMAIN_CHM 書號范圍會很多,我這裡只是簡單舉例,book_id還關聯到書的基本資料表的。小弟沒招了,要是不能一條SQL語句解決的話,能不能給條清晰點的思路。感謝大家了。
      

  3.   

    查了一下,POSTGRESQL没有GROUP_CONCAT之类的函数,用SQL+函数解决吧,还要打开游标
      

  4.   

    請問:wwwwb SQL+函数是指拆分幾個SQL語句還實現嗎?
      

  5.   

    不是,在POSTGRESQL中建立函数,在SQL语句中调用,类似下面的代码(MYSQL)select *,tmaxsj(addtime) from tsj; DELIMITER $$ DROP FUNCTION IF EXISTS `zz`.`tmaxsj`$$ CREATE DEFINER=`root`@`localhost` FUNCTION `tmaxsj`(dd1 datetime) RETURNS datetime 
    BEGIN 
    declare dd date; 
    set dd=date(dd1); 
    SELECT MAX(RQ) into @newendtime FROM ( 
    select * 
    from `test`.ldbrq where nweek-6 <0 and rq between dd and dd +interval 10 day AND BZ IS NULL  
    UNION 
    select * 
    from `test`.ldbrq where nweek-6 <0 and rq>dd  AND BZ IS NULL LIMIT 10) A1; 
    return cast(concat(@newendtime,' ',time(dd1)) as datetime); 
        END$$ DELIMITER ;
      

  6.   

    好的。謝謝,我找到一個CREATE AGGREGATE建立函數的資料,我再自己動手做一做,遇到問題,再上次請教你們了。再次感謝!