2013-10-08 41 views
1

PostgreSQL的新手在這裏。Postgres:鏈接序列日期虛擬表到實際表

我有一些基本上列出了從2/4/201310/7/2013日期序列的SQL。 例如:

select date(generate_series(DATE '20130402', DATE '20131007', interval '1' day)) 

輸出:

"2013-04-02" 
"2013-04-03" 
"2013-04-04" 
"2013-04-05" 
"2013-04-06" 

然後,我必須從myorder表另一個SQL:

select date(date_created) as date_created1, count(id) from myorder group by date_created1 order by date_created1 desc 

輸出:

"2013-08-12;2" 
"2013-08-08";1" 
"2013-08-02";1" 
"2013-08-01";1" 

基本上,這顯示每天的總訂單。

我的問題是如何將第一個SQL鏈接到第二個SQL,以便它將按順序輸出日期和計數(按日期排序)。另外,如果在「myorder」表中找不到訂單,它將顯示「0」。

例如:

2013-08-11沒有任何訂單記錄,因此計數欄顯示"0"

更多少這樣的:

"2013-08-12;2" 
"2013-08-11;0" 
"2013-08-10;0" 
"2013-08-09;0" 
"2013-08-08;1" 
"2013-08-02;1" 
"2013-08-01;1" 

感謝您的幫助提前。

回答

1

剛剛加入這兩個,如下所示:

SELECT dt.d AS date_created1, count(m.id) 
FROM 
    (
    SELECT date(d) 
     FROM generate_series(
      DATE '20130402', DATE '20131007', interval '1' day 
     ) AS d 
    ) AS dt 
    LEFT JOIN myorder m ON m.date_created = dt.d 
GROUP BY date_created1 
ORDER BY date_created1 DESC 

你也可以使用最小/最大獲得第一和最後一個日期值。

+0

試過了,得到這個錯誤:錯誤:不能接受所謂的上下文中設置值函數一套 – user2856772

+0

通過從「generate_series」中取出「date」來解決問題。完整的SQL爲: SELECT date(dt.d)AS date_created1,count(m.id) FROM generate_series(DATE'20130402',DATE'20131007',interval'1'day)AS dt(d) LEFT JOIN myorder m開日期(m.date_created)=日期(dt.d) GROUP BY date_created1 ORDER BY date_created1 DESC 謝謝@MatheusOl的想法。 – user2856772

+0

@ user2856772,你是對的......我糾正了它的正確性,並使用了一種不同於你的方法(我認爲它更清晰)......檢查一下。 – MatheusOl

1

我想用一個CTE使事情變得更簡單閱讀 - 但當然是個人的選擇:

with all_dates as (
    select d::date as 
    from generate_series(DATE '2013-04-02', DATE '2013-10-07', interval '1' day) d 
) 
select ad.d, 
     count(mo.id) as order_count 
from all_dates ad 
    left join myorder mo on mo.date_created = ad.d 
group by ad.d 
order by ad.d;