2013-08-21 27 views
0
-------------------- 
|bookname |author | 
-------------------- 
|book1 |author1 | 
|book1 |author2 | 
|book2 |author3 | 
|book2 |author4 | 
|book3 |author5 | 
|book3 |author6 | 
|book4 |author7 | 
|book4 |author8 | 
--------------------- 

列,但我想booknames欄目和作者作爲其行 前使用行數據在PostgreSQL的9.1

---------------------------------- 
|book1 |book2 |book3 |book4 | 
---------------------------------- 
|author1|author3 |author5|author7| 
|author2|author4 |author6|author8| 
---------------------------------- 

是否有可能在Postgres裏?我怎樣才能做到這一點?

我試過了crosstab,但是我沒有做到這一點。

+2

「*我試圖交叉,但我沒有這樣做*」 - 交叉是要走的路。向我們展示你的嘗試和確切的錯誤信息。 –

+0

[PostgreSQL交叉表查詢]的可能的重複(http://stackoverflow.com/questions/3002499/postgresql-crosstab-query) – swasheck

回答

2

您可以使用具有CASE表達式的聚合函數來獲得結果,但我會首先使用row_number(),因此您有一個可用於對數據進行分組的值。

如果使用row_number()那麼查詢可能是:

select 
    max(case when bookname = 'book1' then author end) book1, 
    max(case when bookname = 'book2' then author end) book2, 
    max(case when bookname = 'book3' then author end) book3, 
    max(case when bookname = 'book4' then author end) book4 
from 
(
    select bookname, author, 
    row_number() over(partition by bookname 
         order by author) seq 
    from yourtable 
) d 
group by seq; 

SQL Fiddle with Demo。我添加了row_number(),因此您將返回書籍的每個不同值。如果排除row_number(),那麼使用具有CASE的聚合將僅返回每本書的一個值。

這個查詢給出結果:

| BOOK1 | BOOK2 | BOOK3 | BOOK4 | 
----------------------------------------- 
| author1 | author3 | author5 | author7 | 
| author2 | author4 | author6 | author8 | 
+0

謝謝它的工作,但 如果書號增加,那麼我應該增加這個語句。 **最大(案例時,bookname ='book4'然後作者結束)book4 ** 有什麼辦法動態創建列? – user2703248

相關問題