如何在POSTGRESQL中从联合查询中减去值?

如何在POSTGRESQL中从联合查询中减去值?,sql,postgresql,union,Sql,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 () 请告诉我,我

我的工会查询是:

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
“剩余”值是通过从所有(15)中减去“红色”(2)+“蓝色”(8)的加法得到的

在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

模式(PostgreSQL v9.6)


查询#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   |


您能否为每个表提供几行示例数据,并说明预期输出应该是什么。另外,请查看除
之外的
。那个关键字在sql中实现了集差。非常感谢!真的提前回答!!谢谢你们,还有来自阿根廷的热烈拥抱!没问题,很乐意帮忙:)
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   |