Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将两个查询与月平均值合并_Sql_Postgresql_Subquery_Aggregate_Full Outer Join - Fatal编程技术网

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