簡體   English   中英

如何從POSTGRESQL中的UNION查詢中減去值?

[英]How do I substract values from an UNION query in POSTGRESQL?

我的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 ()

告訴我我是否正確解釋了自己。

**編輯

根據要求,我添加更多詳細信息:

來自3個表的UNION行是:

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

我需要的是:

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

通過從ALL(15)中減去'RED'(2)+'BLUE'(8)來獲得'REST'值

在Postgresql中,類似:

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

您可以嘗試使用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   |

在數據庫小提琴上查看

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM