Как вычесть значения из запроса UNION в POSTGRESQL? - PullRequest
0 голосов
/ 18 сентября 2018

Мой запрос UNION:

SELECT type, hs
FROM (...) as table_1

UNION

SELECT type, hs
FROM (...) as table_2

UNION 

SELECT type, hs
FROM (...) as table_3

Я хочу сделать следующее:

SELECT 
table_1.hs hs_1, 
table_2.hs hs_2,
table_3.hs - (table_1.hs + table_2.hs) hs_3
FROM ()

Просто скажите мне, правильно ли я объяснил себя.

** Отредактировано

По запросу я добавляю более подробную информацию:

Строки из UNION всех трех таблиц:

type   | hs
___________
'BLUE' | 8
'RED'  | 2
'ALL'  | 15

Что мне нужно:

type   | hs
___________
'BLUE' | 8
'RED'  | 2
'REST' | 5

Значение 'REST' получается путем вычитания сложения 'RED' (2) + 'BLUE' (8) из ALL (15)

В Postgresql что-то вроде:

SELECT 
table_1.hs hs_1, 
table_2.hs hs_2,
table_3.hs - (table_1.hs + table_2.hs) hs_3
FROM ()

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете попытаться использовать CTE, чтобы получить набор результатов UNION.затем используйте CASE WHEN и подзапрос сделает вашу логику.

Схема (PostgreSQL v9.6)

CREATE TABLE T1(
   type varchar(50),
  hs int
);

CREATE TABLE T2(
   type varchar(50),
  hs int
);

CREATE TABLE T3(
   type varchar(50),
  hs int
);




INSERT INTO T1 VALUES ('BLUE',8);
INSERT INTO T2 VALUES ('RED' , 2);
INSERT INTO T3 VALUES ('ALL' , 15);

Запрос # 1

WITH CTE AS (

  SELECT type, hs
   FROM T1
   UNION
   SELECT type, hs
   FROM T2
   UNION 
   SELECT type, hs
   FROM T3
)
SELECT CASE WHEN type = 'ALL' 
             THEN 'REST'
          ELSE type END,
          CASE WHEN type = 'ALL' 
             THEN hs - (SELECT SUM(hs) FROM CTE WHERE type in ('RED','BLUE'))
          ELSE hs END
FROM CTE;

| type | hs  |
| ---- | --- |
| RED  | 2   |
| REST | 5   |
| BLUE | 8   |

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

...