Postgresql数据库按以下表结构和记录,查询结果集:id  user_id  book_id    pub_date
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-209    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-20结果集一: user_id    book_1   book_2   book_3  book_4  book_5  book_6  book_7
  
  1001       true    true     true    true     true    true   true
  1002       true    true     ture    false    true    ture   true
结果集二:  user_id   1月份   2月份  3月份  4月份 5月份  6月份  7月份
   1001       1      2       3      4     5      6      7
   1002      1,2,3                  3     5      6      7
请问以上二种结果集的sql语句怎么写,谢谢!

解决方案 »

  1.   

    是不是只到 book7 ?还是不确定的?同样,第二个也一样?月份固定?显示本年 12个月的?还是不确定?
      

  2.   

    一共会有book 10,我上面只是简单举例,月份的话,一年12个月都有可能。查询范围是从本年9月份开始到次年8月为一个周期。
      

  3.   

    select user_id,
    sum(CASE WHEN book_id=1 THEN 1 ELSE 0 END)>0 as book_1,
    sum(CASE WHEN book_id=2 THEN 1 ELSE 0 END)>0 as book_2,
    sum(CASE WHEN book_id=3 THEN 1 ELSE 0 END)>0 as book_3,
    sum(CASE WHEN book_id=4 THEN 1 ELSE 0 END)>0 as book_4,
    sum(CASE WHEN book_id=5 THEN 1 ELSE 0 END)>0 as book_5,
    sum(CASE WHEN book_id=6 THEN 1 ELSE 0 END)>0 as book_6,
    sum(CASE WHEN book_id=7 THEN 1 ELSE 0 END)>0 as book_7,
    sum(CASE WHEN book_id=8 THEN 1 ELSE 0 END)>0 as book_8,
    sum(CASE WHEN book_id=9 THEN 1 ELSE 0 END)>0 as book_9,
    sum(CASE WHEN book_id=10 THEN 1 ELSE 0 END)>0 as book_10,
    from 表
    group by user_id
      

  4.   

    感謝 ACMAIN_CHM 第一個問題已搞掂,請問第二種結果集如何處理。
    條件是:
    以每年的9月份到次年8月份為一個周期,如時當前查詢時間處於1月份到8月份之間,就是查詢去年9月份開始至當前月的記錄,如果當前查詢時間處於9月份到12月之間,就查詢,本年9月份至當前月的記錄。按月統計,每個用戶買了幾本書,該如何處理,
      

  5.   

    结果集二:user_id   1月份   2月份  3月份  4月份 5月份  6月份  7月份
     1001     1    2     3    4   5    6    7
     1002    1,2,3          3   5    6    7
     
    这个“1,2,3”比较复杂,没有办法直接得到。
      

  6.   

    如果你只有 7 本书,则可以用下面的。select user_id,
        sum(CASE WHEN EXTRACT(MONTH FROM pub_date)=1 THEN book_id*(10^book_id) ELSE 0 END) as 1月份,
        sum(CASE WHEN EXTRACT(MONTH FROM pub_date)=2 THEN book_id*(10^book_id) ELSE 0 END) as 2月份,
        sum(CASE WHEN EXTRACT(MONTH FROM pub_date)=3 THEN book_id*(10^book_id) ELSE 0 END) as 3月份,
        sum(CASE WHEN EXTRACT(MONTH FROM pub_date)=4 THEN book_id*(10^book_id) ELSE 0 END) as 4月份,
        sum(CASE WHEN EXTRACT(MONTH FROM pub_date)=5 THEN book_id*(10^book_id) ELSE 0 END) as 5月份,
        sum(CASE WHEN EXTRACT(MONTH FROM pub_date)=6 THEN book_id*(10^book_id) ELSE 0 END) as 6月份,
        sum(CASE WHEN EXTRACT(MONTH FROM pub_date)=7 THEN book_id*(10^book_id) ELSE 0 END) as 7月份,
        sum(CASE WHEN EXTRACT(MONTH FROM pub_date)=8 THEN book_id*(10^book_id) ELSE 0 END) as 8月份,
        sum(CASE WHEN EXTRACT(MONTH FROM pub_date)=9 THEN book_id*(10^book_id) ELSE 0 END) as 9月份,
        sum(CASE WHEN EXTRACT(MONTH FROM pub_date)=10 THEN book_id*(10^book_id) ELSE 0 END) as 10月份
    from 表
    group by user_id