2016-05-06 1 views
0
SELECT oi.created_at, count(oi.id_order_item) 
FROM order_item oi 

をすべての日付を選択するために、どのように結果がfollwoingがある:SQLクエリで

2016-05-05 1562 
2016-05-06 3865 
2016-05-09 1 
...etc 

問題は、私は、この日のためのid_order_itemがなかった場合でも、すべての日のための情報を必要とすることです。

期待される結果:

Date Quantity 
2016-05-05 1562 
2016-05-06 3865 
2016-05-07 0 
2016-05-08 0 
2016-05-09 1 
+1

を使用しているSQLのバージョンは何? SQLサーバー? MySQL?オラクル?他に何か? – Siyual

+2

あなたの問題に対する(不完全な)答えは、**あなたが望むすべての日付**を持つテーブルを作成し、投稿したクエリに対してLEFT JOINを使用することです。実行時にそれらの日付を作成することを含むどのようなソリューションよりも高速です。 – Edu

+0

@Edu、それは完全な答えですIMHO :-) –

答えて

2

上のいくつかの情報は、データベースに存在しないものを数えることができません。だからあなたはそれらを "数える"ために欠けている日付を生成する必要があります。

SELECT d.dt, count(oi.id_order_item) 
FROM (
    select dt::date 
    from generate_series( 
      (select min(created_at) from order_item), 
      (select max(created_at) from order_item), interval '1' day) as x (dt) 
) d 
    left join order_item oi on oi.created_at = d.dt 
group by d.dt 
order by d.dt; 

クエリでは、既存の注文アイテムの最小日と最大日が取得されます。

あなたは、特定の日付範囲のカウントをしたい場合は、サブ選択を削除することができます

SELECT d.dt, count(oi.id_order_item) 
FROM (
    select dt::date 
    from generate_series(date '2016-05-01', date '2016-05-31', interval '1' day) as x (dt) 
) d 
    left join order_item oi on oi.created_at = d.dt 
group by d.dt 
order by d.dt; 

SQLFiddle:あなたはhttp://sqlfiddle.com/#!15/49024/5

-1

溶液#1はあなたがすべての日付データを格納されている日付の表を必要としています。次に、期間に応じて左結合を行います。

溶液#2

WITH DateTable AS 
(
    SELECT DATEADD(dd, 1, CONVERT(DATETIME, GETDATE())) AS CreateDateTime, 1 AS Cnter 
    UNION ALL 
    SELECT DATEADD(dd, -1, CreateDateTime), DateTable.Cnter + 1 
    FROM DateTable 
    WHERE DateTable.Cnter + 1 <= 5 
) 

は、あなたの入力に基づいて一時テーブルを生成し、その後、参加左を行います。

+0

合意それは完全な解決策ではなく、問題の解決方法の一例です。 PostgreSQLでは、再帰CTEを行うことができます。 – niketshah90

+0

これはPostgres用の無効なSQLです(このためにCTEは必要ありません。 'generate_series()'はうまくいくでしょう) –

0

フレンド、Postgresql Count関数はNull値を無視します。文字通り、検索している列のNULL値は考慮されません。このため、Group By節にoi.created_atを含める必要があります

PostgreSQLは行ごとに順次検索します。クエリの不可欠な部分はCountであり、countは基本的にその行のクエリを停止するため、nullのid_order_itemを持つ日付は無視されます。 oi.created_atでグループ化すると、この列はカウントよりも優先され、0の値が返されます。

SELECT oi.created_at, count(oi.id_order_item) 
FROM order_item oi 
Group by io.created_at 

TechontheNet(情報の私の最も信頼できるソース)から: あなたがカウント機能にカプセル化されていない、あなたのSELECT文で1列に列挙されているので、あなたは、GROUP BY句を使用する必要があります。したがって、部門フィールドはGROUP BYセクションにリストされなければなりません。

PostgreSQLの でカウントhttp://www.postgresqltutorial.com/postgresql-count-function/ http://www.techonthenet.com/postgresql/functions/count.php