Sql 将两个查询与月平均值合并
我需要将这两个查询的结果合并到一个具有以下结构的返回中:Sql 将两个查询与月平均值合并,sql,postgresql,subquery,aggregate,full-outer-join,Sql,Postgresql,Subquery,Aggregate,Full Outer Join,我需要将这两个查询的结果合并到一个具有以下结构的返回中: "date", avg(selic."Taxa"), avg(titulos."puVenda") 表的部分结构: selic "dtFechamento" date, "pTaxa" real titulos "dtTitulo" date, "puVenda" real, "nomeTitulo" character(30) 查询表selic: select to_char("dtFechamento", 'YYYY-MM')
"date", avg(selic."Taxa"), avg(titulos."puVenda")
表的部分结构:
selic
"dtFechamento" date,
"pTaxa" real
titulos
"dtTitulo" date,
"puVenda" real,
"nomeTitulo" character(30)
查询表selic
:
select to_char("dtFechamento", 'YYYY-MM') as data, avg("pTaxa")
from "selic"
group by data
order by data
查询表titulos
:
select to_char("dtTitulo", 'YYYY-MM') as data, avg("puVenda")
from "titulos"
where "nomeTitulo" = 'LFT010321'
group by data
order by data
我尝试了子查询,但它返回的字段彼此相邻,无法集合
select *
from (select to_char("dtFechamento", 'YYYY-MM') as data, avg("pTaxa")
from "selic"
group by data
order by data) as selic,
(select to_char("dtTitulo", 'YYYY-MM') as data, avg("puVenda")
from "titulos"
where "nomeTitulo" = 'LFT010321'
group by data
order by data) as LFT010321;
假设您希望每月返回一行,其中两个查询中的任何一个都返回一行。并将另一个查询中缺少的值填充为NULL 使用: 聚合后的连接速度比聚合前快得多(连接操作更少) 在
时间戳
值上按分组、加入
和顺序
也比在文本
格式副本上更快。通常也更干净,更不容易出错(尽管在这种特殊情况下文本是明确的)。这就是为什么我在较低级别上使用而不是来\u char()
如果月份的格式不重要,您可以只返回时间戳值。否则,您可以在完成处理后以任何方式格式化
类似案例,请提供更多解释:
- 这应该能满足您的需要。内部的“PQ”(PreQuery)在每个可能的日期之间进行联合,但也添加了一个标志列来标识它与哪个平均值关联。每个零件按日期分组。现在,外部查询在给定日期最多有2条记录。。。一个是税收,另一个是文达。因此,现在您不需要任何完整的外部联接,也不需要构建一些动态日历数据基础来获取所有可能日期的详细信息
因此,只有税收平均数或文达平均数或两者都有可能
SELECT
PQ.Data,
SUM( CASE when PQ.SumType = 'T' then PQ.TypeAvg else 0 end ) as AvgTax,
SUM( CASE when PQ.SumType = 'V' then PQ.TypeAvg else 0 end ) as AvgVenda
from
( select
to_char( dtFechamento, 'YYYY-MM') as data,
'T' as sumtype,
avg( pTaxa ) as TypeAvg
from
selic
group by
to_char( dtFechamento, 'YYYY-MM') as data
UNION ALL
select
to_char( dtTitulo, 'YYYY-MM') as data,
'V' as sumType,
avg( puVenda ) as TypeAvg
from
titulos
where
nomeTitulo = 'LFT010321'
group by
to_char( dtTitulo, 'YYYY-MM') ) PQ
group by
PQ.Data
order by
PQ.Data
如果一个月内只有一个查询有结果,返回什么?另一个为空?在两个查询中都没有结果的情况下,在这两个查询之间的几个月会发生什么?没有行(跳过该月)?或者用两个空值返回月份?我冒昧地修正了你的名字和双引号,这会分散你对实际问题的注意力。
SELECT
PQ.Data,
SUM( CASE when PQ.SumType = 'T' then PQ.TypeAvg else 0 end ) as AvgTax,
SUM( CASE when PQ.SumType = 'V' then PQ.TypeAvg else 0 end ) as AvgVenda
from
( select
to_char( dtFechamento, 'YYYY-MM') as data,
'T' as sumtype,
avg( pTaxa ) as TypeAvg
from
selic
group by
to_char( dtFechamento, 'YYYY-MM') as data
UNION ALL
select
to_char( dtTitulo, 'YYYY-MM') as data,
'V' as sumType,
avg( puVenda ) as TypeAvg
from
titulos
where
nomeTitulo = 'LFT010321'
group by
to_char( dtTitulo, 'YYYY-MM') ) PQ
group by
PQ.Data
order by
PQ.Data