【问题标题】:How do I substract values from an UNION query in POSTGRESQL?如何从 POSTGRESQL 中的 UNION 查询中减去值?
【发布时间】:2018-09-19 04:31:49
【问题描述】:

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

'REST' 值是从 ALL (15) 中减去 'RED' (2) + 'BLUE' (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 ()

【问题讨论】:

  • 您能否为每个表提供几行示例数据,并显示预期的输出应该是什么。另外,看看EXCEPT。该关键字在 sql 中实现了 set 差异。

标签: sql postgresql union


【解决方案1】:

您可以尝试使用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   |

View on DB Fiddle

【讨论】:

  • 非常感谢!真的提前回答!!谢谢你和来自阿根廷的大拥抱!
  • 没问题很高兴帮助:)
猜你喜欢
  • 2023-03-16
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多