2011-10-28 6 views
0

私はcount()関数に問題があります。私はそれを特定の条件下でのみ数えたいと思う。Oracleのsql count()関数ですか?

私は何をしたい各企業、会社名、会社の上司の名前と

2010年に作られた3日間を超えるレンタルの数を表示するので、条件がされている。数

したがって、会社に条件を満たすレンタルがない場合は、結果テーブルから削除してはならず、代わりにゼロを書き込む必要があります。たとえば、次のようになります。

company 1 -------------------- BOSS 1-----------------------2 
company 2---------------------- BOSS 2---------------------- 0 --doesn't satisfy the condition: 0 rentals 
company 3-----------------------BOSS 3 ----------------------5 
company 4---------------------- BOSS 4--------------------------1 
company 4 ----------------------BOSS 5 ----------------------- 0 --doesn't satisfy the condition: 0 rentals 

AND NOT 

company 1----------------------BOSS 1---------------------------2 
company 3--------------------- BOSS 3---------------------------5 
company 4----------------------BOSS 4 --------------------------1 

My SQLコードは、最初の表ではなく2番目の表を表示します。これは私のコードです:任意のアイデア

count(l.date_location BETWEEN to_date('01/01/2010','DD.MM.YYYY') AND to_date('31/12/2010','DD.MM.YYYY') AND 
      l.duree > 3) 

SELECT ag.nom_agence as NOM_AGENCE, ag.responsable_agence, count(*) as RESPONSABLE 
FROM agences ag, locations l 
WHERE ag.id_agence = l.id_agence AND 
     l.date_location BETWEEN to_date('01/01/2010','DD.MM.YYYY') AND to_date('31/12/2010','DD.MM.YYYY') AND 
     l.duree > 3 
     group by ag.nom_agence,ag.responsable_agence 

私は(where句なし)この形式の何かをしたいですか?ありがとう。

答えて

3

ロケーションテーブルの外部結合を使用して、長さに関係なく常に期間内のすべてのレンタルを引き出す必要があります。

その後、レンタル数を3日以上カウントします。

はこれを試してみてください:

SELECT 
    NOM_AGENCE, 
    RESP_AGENCE, 
    SUM(RESPONSABLE) 
FROM 
    (
    SELECT 
     ag.nom_agence as NOM_AGENCE, 
     ag.responsable_agence RESP_AGENCE, 
     CASE 
     WHEN l.duree > 3 THEN 1 
     ELSE 0 
     END RESPONSABLE 
    FROM 
     agences ag LEFT OUTER JOIN locations l ON ag.id_agence = l.id_agence 
              AND l.date_location 
              BETWEEN to_date('01/01/2010','DD.MM.YYYY') 
              AND to_date('31/12/2010','DD.MM.YYYY') 
) 
GROUP BY 
    NOM_AGENCE, 
    RESP_AGENCE 
+0

「l.duree> 3」はフィルタリングしていません。実際には、「3日を超えるレンタル数」という条件を満たす必要があります。しかし、WHERE句は結果を制限しています – mkab

+0

私の最新の編集を試してみてください。元のクエリでちょっと混乱していました。 – StevieG

+0

これは本当に '(エラー:キーワードがありません)'動作しませんでした。 'case'の使い方について。 – mkab

0

が持つ句を使用します

having count(*) > 0 
0

を私の迅速な答えは、JOINとINNERはあなたが行うことに参加できないLEFTをしなければならないということです。これを試してみてください:

SELECT ag.nom_agence as NOM_AGENCE, ag.responsable_agence, count(*) as RESPONSABLE 
FROM agences ag 
left join locations l on l.id_agence = ag.id_agence 
WHERE 
    l.date_location BETWEEN to_date('01/01/2010','DD.MM.YYYY') AND                  

    to_date('31/12/2010','DD.MM.YYYY') AND 
      l.duree > 3 
group by ag.nom_agence,ag.responsable_agence 
+0

同じ問題。 'WHERE'節は結果を制限しています。それは私に '内部結合 'と同じテーブルを与える – mkab

0
SELECT ag.nom_agence as NOM_AGENCE, ag.responsable_agence, count(*) as RESPONSABLE 
FROM agences ag LEFT OUTER JOIN locations l ON ag.id_agence = l.id_agence 
WHERE l.date_location BETWEEN to_date('01/01/2010','DD.MM.YYYY') AND to_date('31/12/2010','DD.MM.YYYY') AND l.duree > 3 
group by ag.nom_agence,ag.responsable_agence 

をキーであるあなたはLEFT OUTERは関係なく、一致する場所のレコード

+0

同じ問題。 'WHERE'節は結果を制限しています。それは私に 'inner join'と同じテーブルを与えます – mkab

1

次のことを試してみてくださいがあるかどうかのごagencesテーブルからすべてのレコードを取得するどのJOINを行う必要があります(私はそれを試していない)。

基本的には、代理店のテーブルと代理店によってグループ化されたレンタルは、検索フィルターに沿ってグループ化されています。

NVLは、私は、クエリを見つけ0

select left.id_agence, left.nom_agence, left.responsable_agence, NVL(right.count, 0) 
from 
(select id_agence, nom_agence, responsable_agence from agences) left 
left outer join 
(
    SELECT id_agence, count(*) as count 
    FROM locations 
    WHERE date_location BETWEEN to_date('01/01/2010','DD.MM.YYYY') AND  to_date('31/12/2010','DD.MM.YYYY') AND 
     duree > 3 
    group by id_agence 
) right 
on left.id_agence = right.id_agence 
+0

それは動作しますが、私は' NVL'句を理解しません。私のために進んでいるようだ。私はOracle sqlの学習を始めました。感謝します:) – mkab

+0

@mkab、NVLは単に値がnullの場合に別の値で置き換えます。たとえば、NVL(3、4)は3が3でないため3を返しますが、NVL(NULL、12)は12を返します。外部ジョインはデータセットの値が一致しないNull値を生成するので、 0。 –

-1

に右のクエリで一致していない代理店のカウントを変換します。それは私に適切なテーブルを与える

SELECT ag.nom_agence as NOM_AGENCE, ag.responsable_agence as RESPONSABLE, count(case when to_char(l.date_location, 'YYYY') = '2010' and l.duree>3 then 1 end) as NOMBRE 
FROM agences ag, locations l 
WHERE ag.id_agence = l.id_agence 
     group by nom_agence, responsable_agence 

あなたの助けをありがとう。

関連する問題