2017-09-18 8 views
0

時間単位で集計された総売上金額を集計する集計を行いたいとします。売り上げの有無にかかわらず、過去24時間以内にすべての時間を返す必要があり、その時間内に発生した売り上げを含める必要があります。私はそうのようなGENERATE_SERIESをやってこれを行うにはPSQL - 左結合後にNULL列を返さない

...

SELECT * FROM GENERATE_SERIES(
    date_trunc('hour', current_timestamp - interval '23 hour'), 
    date_trunc('hour', current_timestamp), 
    '1 hour' 
) 

これは、次の行

generate_series 
------------------------ 
2017-09-17 16:00:00-07 
2017-09-17 17:00:00-07 
2017-09-17 18:00:00-07 
2017-09-17 19:00:00-07 
2017-09-17 20:00:00-07 
2017-09-17 21:00:00-07 
2017-09-17 22:00:00-07 
2017-09-17 23:00:00-07 
2017-09-18 00:00:00-07 
2017-09-18 01:00:00-07 
2017-09-18 02:00:00-07 
2017-09-18 03:00:00-07 
2017-09-18 04:00:00-07 
2017-09-18 05:00:00-07 
2017-09-18 06:00:00-07 
2017-09-18 07:00:00-07 
2017-09-18 08:00:00-07 
2017-09-18 09:00:00-07 
2017-09-18 10:00:00-07 
2017-09-18 11:00:00-07 
2017-09-18 12:00:00-07 
2017-09-18 13:00:00-07 
2017-09-18 14:00:00-07 
2017-09-18 15:00:00-07 
(24 rows) 

これは、これまでのところ良いですが返されます。今私は番号を得るために私の注文表に加わりたいと思う。私はこれを取得、これを実行すると、私は

hour   | price | merchant_id 
---------------------+---------+------------- 
        |  0 |   1 
2017-09-18 09:00:00 | 2934.00 |   1 
(2 rows) 

2質問...

1 ...

SELECT 
    date_trunc('hour', orders.ordered_at) as hour, 
    COALESCE(SUM(orders.total), 0) AS price, 
    #{merchant.id} AS merchant_id 
FROM GENERATE_SERIES(
    date_trunc('hour', current_timestamp - interval '23 hour'), 
    date_trunc('hour', current_timestamp), 
    '1 hour' 
) AS h 
LEFT JOIN orders 
    ON date_trunc('hour', orders.ordered_at) = h 
    AND orders.merchant_id = merchant_id 
GROUP BY hour 
ORDER BY hour DESC; 

...これをやっている - なぜ私はNULLの時間を持っています

2 - 他のすべての時間はどこに行きましたか? 1行に価格があり、他の行に価格が0の24行があります。

答えて

1

NULL時間は間違った表から引き出しているためです。代わりに、使用します。

SELECT gs.hh, COALESCE(SUM(o.total), 0) AS price, 
     #{merchant.id} AS merchant_id 
FROM GENERATE_SERIES(date_trunc('hour', current_timestamp - interval '23 hour'), 
        date_trunc('hour', current_timestamp), 
        '1 hour' 
        ) gs(hh) LEFT JOIN 
     orders o 
     ON date_trunc('hour', o.ordered_at) = gs.hh AND 
     o.merchant_id = merchant_id 
GROUP BY gs.hh 
ORDER BY gs.hh DESC; 

私はまた、あなたのON句になりたいよね:

ON o.merchant_id = #{merchant.id} 

o.merchant_id = merchant_idのではo.merchant_id = o.merchant_idとして解釈されるべきです。

+0

aha!ありがとうございました!参考までに、あなたの答えは1つのタイプミスです。 'COALESCE(SUM(o.total)'でなければなりません。 – cheeseandpepper

関連する問題