2016-06-25 127 views
1

我需要這兩個查詢的結果放在一起與以下結構退貨單:結合兩個查詢每月平均

"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; 
+0

如果只有一個查詢有一個月的結果返回什麼?對另一個NULL?幾個月之間沒有任何結果的查詢?沒有行(跳過月份)?或者用兩個NULL值返回該月份? –

+1

我冒昧解決您的名字和雙引號,這會分散您的實際問題。 –

回答

1

假設您希望每個月都返回一行,其中兩個查詢都返回一行。並用NULL填充其他查詢中缺少的值。

使用FULL [OUTER] JOIN

SELECT to_char(mon, 'YYYY-MM') AS data, s.avg_taxa, t.avg_venda 
FROM (
    SELECT date_trunc('month', "dtFechamento") AS mon, avg("pTaxa") AS avg_taxa 
    FROM selic 
    GROUP BY 1 
    ) s 
FULL JOIN (
    SELECT date_trunc('month', "dtTitulo")  AS mon, avg("puVenda") AS avg_venda 
    FROM titulos 
    WHERE "nomeTitulo" = 'LFT010321' 
    GROUP BY 1 
    ) t USING (mon) 
ORDER BY mon; 

這是大大快後比以前聚集加入(更少的連接操作)。

它也快比上一個text再現GROUP BYJOINORDERtimestamp值。通常也更清潔並且不易出錯(儘管在這種特殊情況下文本是明確的)。這就是爲什麼我使用date_trunc()而不是to_char()在較低的水平。

如果該月的格式不重要,則可以返回時間戳值。否則,您可以在完成處理後以任何方式進行格式化。

類似的情況有更多的解釋:

1

這應該得到你所需要的東西。內部「PQ」(PreQuery)在每個可能的日期之間都會進行聯合,但還會添加一個標誌列以標識與哪個平均值相關聯。每個部分按日期分組。所以現在,外部查詢將在一個給定的日期最多有2個記錄...一個是稅,另一個是文達。所以現在你不需要任何完整的外連接,也不需要建立一些動態的日曆數據基礎來獲得所有可能日期的細節。

因此,只有Tax平均值或Venda平均值或兩者都是可能的。

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