2017-04-04 10 views
0

私はSQLにかなり慣れているので、私の無知を言い訳したり、ここで基本的な質問をしています。私がしようとしているのは、アウトレットが最後の日に割り当てを作成しなかった場合にテーブルが0の値を返すようにすることです。私が使用しているコードはこれです:SQLカウント関数が0を返すようにするにはどうすればよいですか?

SELECT public.outlets.title AS "Outlet", 
      COUNT(public.outlets.id) AS "Assignment Count" 
    FROM public.assignments 
    JOIN public.users 
     ON public.users.id=public.assignments.creator_id 
    LEFT JOIN public.outlets 
     ON public.outlets.id = public.users.outlet_id 
    WHERE public.outlets.dispatch_enabled = 'True' 
     AND DATE(public.assignments.created_at) = DATE(CURRENT_TIMESTAMP- interval '1 day') 
    GROUP BY public.outlets.title 
    HAVING count(public.outlets.id) = 0 
    ORDER BY public.outlets.title ASC 

私は、COALESCEを試みたが、私は本当に私がそれを正しく実装してるかどうかを知ることは十分理解していない正直に言うと。それが現れて、私が使用している現在のコードは私に "NO ROWS RETURNED"を与えています。私はどこの句の様々な部分を取り出して、それが役に立たないかどうかを見てみました。どんな助けでも大歓迎です!!

+0

'public.outlets'へのLEFT JOINは、' public.outlets'の値をチェックする 'WHERE'節によって無効になります。それはインナー・ジョイントなのかもしれません。なぜなら、あなたは何の行も得ていないからです。 –

答えて

0

割り当て数があるアウトレットをお探しですか?だから私はあなたがコンセントを "FROM"にしたいと思っています。あなたが左にWHERE条件の一部を移動することができます

SELECT public.outlets.title AS "Outlet", 
     COUNT(public.assignments.id) AS "Assignment Count" 
FROM public.outlets 
JOIN public.users 
    ON public.outlets.id = public.users.outlet_id 
LEFT JOIN public.assignments 
    ON public.users.id=public.assignments.creator_id 
    AND DATE(public.assignments.created_at) = DATE(CURRENT_TIMESTAMP-interval '1 day') 
WHERE public.outlets.dispatch_enabled = 'True' 
GROUP BY public.outlets.title 
HAVING count(public.assignments.id) = 0 
ORDER BY public.outlets.title ASC 
+0

これはうまくいった!ありがとうございました!だから、私はテーブルに後ろ向きに参加していましたか?もう一度、私の非常に基本的な質問に申し訳ありませんが、ありがとうございます! – Keana

+0

うわー、あなたが知っているテーブルから始めて、レコードを持たないかもしれないテーブルに結合を残してから、レコードを持っていない行を探してください。あなたを混乱させることはありませんが、Left join is null形式でこれを実行することもできます。あなたはそれを見ることができ、それはほぼ同じに動作します。 – CraigS

0

をすべての行を保持するテーブルで開始する必要があります。

SELECT o.title AS "Outlet", COUNT(*) AS "Assignment Count" 
FROM public.outlets o LEFT JOIN 
    public.users u 
    ON o.id = u.outlet_id LEFT JOIN 
    public.assignments a 
    ON u.id = a.creator_id AND 
     DATE(a.created_at) = DATE(CURRENT_TIMESTAMP- interval '1 day') 
WHERE o.dispatch_enabled = 'True' 
GROUP BY o.title 
HAVING count(*) = 0 
ORDER BY o.title ASC; 

注:

  • 表の別名を書くことや読むことをクエリがはるかに容易になります。
  • 保持する行(SELECT o.title)を定義するので、public.outletsで始める必要があります。
  • LEFT JOINを使用して他のテーブルが持ち込まれます。
  • assignmentsの条件は、WHEREではなくON句にする必要があります。
  • IDはカウントできますが、COUNT(*)の方が簡単です。
0

は、JOIN、と私はまた、あなたがテーブルの順序を切り替える必要があると思います。最後に、あなたはおそらく明確なを使用して、参加の左部分に、テーブル上のフィールドをカウントする必要があります。

select 
    public.outlets.title AS "Outlet", 
    COUNT(DISTINCT public.assignments.id) AS "Assignment Count" 
from 
    public.outlets left join public.users 
    ON public.outlets.id = public.users.outlet_id 

    left join public.assignments 
    ON (
    public.users.id=public.assignments.creator_id 
    AND DATE(public.assignments.created_at) = DATE(CURRENT_TIMESTAMP- interval '1 day') 
) 
where 
    public.outlets.dispatch_enabled = 'True' 
group by 
    public.outlets.title 
having 
    count(public.outlets.id) = 0 
order by 
    public.outlets.title ASC 
0

おそらく問題は、これらの行に

LEFT JOIN public.outlets 
    ON public.outlets.id = public.users.outlet_id 
WHERE public.outlets.dispatch_enabled = 'True' 

であることがあることをpublic.outlets.dispatch_enabledが必要ですnullでないので、効率的にLEFT JOIN public.outletsをINNERに変換します。したがって、count(public.outlets.id) = 0の行は存在しません。それをリファクタリングする

関連する問題