Postgres - запрос выбора полей из нескольких таблиц в качестве столбцов. - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть следующие таблицы

Таблица 1: Продукт

id  name  
1   Bread  
2   Bun  
3   Cake  

Таблица 2: Статьи расходов

product| quantity  
1 |      100  
2 |      150  
3 |      180  
1 |      25  
2 |      30  

Таблица 3: Статьи доходов

product| quantity  
1 |      100  
2 |      150  
3 |      180  
1 |      25  
2 |      30  

Теперь я хочу получить результаты, подобные этим

product   |  sum of quantity of expenseitem | sum of quantity of income item  
1         |  125 |  125  
2         |  180 |  180  
3         |  180 |  180

Каков запрос для получения этого результата?
Спасибо

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Аналогично ответу @ D-Shih, PostgreSQL 9.4+ поддерживает предложение FILTER() для условного агрегирования вместо операторов CASE:

SELECT p.id,
       SUM(quantity) FILTER (WHERE grp = 1) SUMExpenseItems,
       SUM(quantity) FILTER (WHERE grp = 2) SUMIncomeItems
FROM 
     -- ...same union all query...
GROUP BY p.id
0 голосов
/ 09 декабря 2018

Можно попытаться использовать UNION ALL в подзапросе с условием в статистической функции

Схема (PostgreSQL v9.6)

CREATE TABLE Product(
    id int,
    name varchar(50)
);


INSERT INTO Product VALUES (1,'Bread');  
INSERT INTO Product VALUES (2,'Bun');  
INSERT INTO Product VALUES (3,'Cake');  

CREATE TABLE ExpenseItems(
    product int,
    quantity int
);


INSERT INTO ExpenseItems VALUES (1,100);  
INSERT INTO ExpenseItems VALUES (2,150);  
INSERT INTO ExpenseItems VALUES (3,180);  
INSERT INTO ExpenseItems VALUES (1,25);  
INSERT INTO ExpenseItems VALUES (2,30);  


CREATE TABLE IncomeItems(
    product int,
    quantity int
);


INSERT INTO IncomeItems VALUES (1,100);  
INSERT INTO IncomeItems VALUES (2,150);  
INSERT INTO IncomeItems VALUES (3,180);  
INSERT INTO IncomeItems VALUES (1,25);  
INSERT INTO IncomeItems VALUES (2,30);  

Запрос № 1

SELECT p.id,
      SUM(CASE WHEN grp = 1 THEN quantity END) SUMExpenseItems,
      SUM(CASE WHEN grp = 2 THEN quantity END) SUMIncomeItems
FROM (
    SELECT product, quantity,1 grp 
    FROM ExpenseItems
    UNION ALL
    SELECT product, quantity,2 
    FROM IncomeItems
) t1 JOIN Product p on p.id = t1.product
GROUP BY p.id;

| id  | sumexpenseitems | sumincomeitems |
| --- | --------------- | -------------- |
| 1   | 125             | 125            |
| 2   | 180             | 180            |
| 3   | 180             | 180            |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...