首页 > 解决方案 > 如何将 2 个 SQL 组合成一个 SQL

问题描述

表 C(id, type) 包含所有唯一客户 ID 的列表,包括交易和不交易。每个 id 都是唯一的,并且只有一个类型。

Table T(date, id, type, money) 是交易表,这里id不唯一。

表 C 的唯一 ID 比 T 中的多,因为并非所有客户端都在进行事务。
T 表中的唯一 id 是 C 表中 id 的子集。

T 表的每种类型的 AVG(money) 和 STD(money) 的 SQL:

SELECT
type,
AVG(money) AS avg_for_active_clients,
STDEV(money) AS stdev_for_active_clients,
COUNT(DISTINCT id) as cnt_active_clients
FROM (
  SELECT id , type, sum(money) as money 
  FROM T
  GROUP BY id, type
) A
GROUP BY type

用于 C 表的每种类型的 AVG(money) 和 STD(money) 的 SQL:

SELECT  
type,
AVG(money) AS avg_for_all_clients,
STDEV(money) stdev_for_all_clients,
COUNT(DISTINCT id) as cnt_all_clients
FROM (
  SELECT C.id, C.type , COALESCE(A.money, 0) as money FROM C 
  LEFT JOIN (
      SELECT id ,   sum(money) as money 
      FROM T
      GROUP BY  id 
  ) A
  ON C.id = A.id
) B
GROUP BY type

是否可以将上面的 2 个 SQL 组合成单个 SQL?我的数据库是 Redshift。

标签: sqlamazon-web-servicesamazon-redshift

解决方案


您可以将您的select #1与您的select #2垂直或水平相结合。

要垂直组合它们,您可以使用UNION ALL. 例如:

select #1
union all
select #2

要水平组合它们,您可以使用FULL JOIN. 例如:

select *
from (
  select #1
) x
full join (
  select #2
) y on y.type = x.type

推荐阅读