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

しかし、本の名前を列として、著者をその行の例として欲しい

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

postgresで可能ですか?これどうやってするの?

クロス集計を試みましたが、これを行うことができませんでした。

4

1 に答える 1

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 で集計を使用すると、書籍ごとに 1 つの値のみが返されます。

このクエリの結果は次のとおりです。

|   BOOK1 |   BOOK2 |   BOOK3 |   BOOK4 |
-----------------------------------------
| author1 | author3 | author5 | author7 |
| author2 | author4 | author6 | author8 |
于 2013-08-21T13:37:56.277 に答える