1

私はそのような要求をする必要があります: 文字を含み、i適切な従業員数を持つ都市のリストを選択してください. また、一部の都市では従業員が 0 人である可能性があり、一部の従業員フィールドでは DEBT が null である可能性があることに注意する必要があります。

テーブルdepart

debt    city
-------------
43      odesa
23      kiev
79      lviv
78      lviv
12      rivne

テーブルempl

ide     fn      ln      debt
----------------------------
3421    jed     trt     43
354     jed     res     43
43      ged     hjkhg   79
73      ghghg   gfgf    79
456     jkl     gdfg    
532     kkhg    vjv     23
45      ki      vt      
243     ki      vt      78

私はこのクエリを書きました:

select depart.CITY, count (*) as numb 
from depart 
   inner join empl on  empl.DEBT=depart.DEBT
where depart.CITY like '%i%'
group by depart.CITY;

しかし、一部の都市には従業員が 0 人いる可能性があり (たとえば、この要求では従業員が 0 人の都市は表示されませんrivne)、一部の従業員フィールドでは DEBT が null になる可能性があることに注意する方法がわかりません。

私はヒキガエルでオラクルを使用しています。

予想された結果

city    numb
kiev    1
rivne   0
lviv    3
4

3 に答える 3

3

これを行う:

select depart.CITY, count (*) as numb 
from depart inner join empl on empl.DEBT=depart.DEBT
where depart.CITY like '%i%'
group by depart.CITY;

GROUPBYの前にWHEREが最初に来る

于 2012-08-07T07:08:48.360 に答える
3

WHERE句は句の前に来GROUP BYます。
このような:

SELECT depart.CITY, COUNT (*) AS numb 
FROM depart INNER JOIN empl ON empl.DEBT=depart.DEBT
WHERE depart.CITY LIKE '%i%'    
GROUP BY depart.CITY;

WHERE 句については、このフィドルを参照してください。

または、次のようにHAVING句を使用することもできます

SELECT depart.CITY, COUNT (*) AS numb 
FROM depart INNER JOIN empl ON empl.DEBT=depart.DEBT
GROUP BY depart.CITY
HAVING depart.CITY LIKE '%i%';

HAVING 句については、このフィドルを参照してください。

HAVING句を使用する可能性が高くなります。
詳細については、このリンクを参照してください

于 2012-08-07T07:17:51.067 に答える
2

whereグループ化する前に基準移動を処理します。存在しない従業員または null DEBT を許可するには、左外部結合を使用します。

select depart.CITY, count (empl.DEBT) as numb 
  from depart 
  left join empl 
    on empl.DEBT = depart.DEBT
 where depart.CITY like '%i%'
 group by depart.CITY;

すべての従業員を部門別にグループ化するには、外部結合を逆にします。

select depart.CITY, count (empl.ide) as numb 
  from empl  
  left join depart
    on empl.DEBT = depart.DEBT
 -- Note: condition is now part of a join. This is required
 --       as part of outer join because otherwise left hand
 --       table row would be filtered out.
   and depart.CITY like '%i%'
 group by depart.CITY;

(おそらくide従業員の主キーです)。しかし、これは従業員のいない部門を返しません。また、部門の市区町村が一致しない場合は CITY が null になる%i%か、最初から empl.DEBT が null になります。

この問題を解決するには、最初のクエリをユニオン all で拡張して、部門のない従業員を取得するように設計することができます。しかし、疑問があります。部門のない従業員だけが必要なのか、それとも、部門のない名前が含まれる都市で働いていない従業員を検討するのか、というiことです。私は 2 番目の可能性を選択しました。

select depart.CITY, count (empl.DEBT) as numb 
  from depart 
  left join empl 
    on empl.DEBT = depart.DEBT
 where depart.CITY like '%i%'
 group by depart.CITY;
select '(unknown or unmatched city)', count (*) as numb
  from empl
  left join depart
    on empl.DEBT = depart.DEBT
   and depart.CITY like '%i%'
 where depart.DEBT is null;

部門のない従業員と を含まない都市で働く従業員を区別する必要がある場合は、 caseiを使用できます。

select case when depart.CITY like '%i%'
            then depart.CITY
            when depart.DEBT is null
            then '(No department)'
            else '(City does not match %i%)'
        end as CITY,
       count (*) as numb
  from empl
  left join depart
    on empl.DEBT = depart.DEBT
 group by 
       case when depart.CITY like '%i%'
            then depart.CITY
            when depart.DEBT is null
            then '(No department)'
            else '(City does not match %i%)'
        end

このクエリは、一致する都市、一致しない都市、部門のない従業員をカウントします。

于 2012-08-07T07:26:31.087 に答える