PostgreSQL Crosstab Выбрать запрос - PullRequest
0 голосов
/ 04 июля 2018

Кто-нибудь знает, как создавать кросс-таблицы запросов в PostgreSQL? Например, у меня есть две следующие таблицы:

ТАБЛИЦА A

| ID 1       | ID 2        | ID 3         | 
|:-----------|------------:|:------------:|
| 00001      |        01   |    0001      |
| 00001      |        02   |    0001      |  
| 00001      |        01   |    0002      |

ТАБЛИЦА B

| ID 1       | ID 2        | ID 3         | price        | tax_rate     |
|:-----------|------------:|:------------:|:------------:|:------------:|
| 00001      |        01   |    0001      |5000          | 8            |
| 00001      |        01   |    0001      |6000          | 10           |

Я бы хотел, чтобы запрос возвратил следующую кросс-таблицу:

| ID 1       | ID 2        | ID 3         | price_8      | price_10     |  
|:-----------|------------:|:------------:|:------------:|:------------:| 
| 00001      |        01   |    0001      |5000          | 6000         | 
| 00001      |        02   |    0001      |null          | null         |
| 00001      |        01   |    0002      |null          | null         |

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вот пример для ваших таблиц:

SELECT split_part(id, '.', 1) AS id1,
split_part(id, '.', 2) AS id2,
split_part(id, '.', 3) AS id3,
price_8, price_10
FROM crosstab(
  'select id1||''.''||id2||''.''||id3 as id, cast(tax_rate as text) as taxRate, price 
   from (select * from Table1 natural left join Table2
   order by 1,2,3) t'
   )   
AS ct (
  id text, 
  price_8 int,
  price_10 int
  );
0 голосов
/ 04 июля 2018

Попробуйте это -

SELECT * FROM crosstab(
       'SELECT A.ID1, A.ID2, A.ID3, B.PRICE, B.TAX_RATE 
        FROM A
        LEFT JOIN B
        ON A.ID1 = B.ID1
        AND A.ID2 = B.ID2
        AND A.ID3 = B.ID3') AS
FINAL_RESULT (ID1 TEXT, ID2 TEXT, ID3 TEXT, PRICE_8 NUMERIC, PRICE_9 NUMERIC);
...