1

我需要提出这样的要求:选择包含字母i并有适当数量的员工的城市列表。另外我需要注意的是,某些城市可能有 0 名员工,而对于某些员工字段,DEBT 可能为空。

桌子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 名员工(例如,此请求未显示rivne有 0 名员工的城市),并且某些员工字段的 DEBT 可能为空。

我将甲骨文与蟾蜍一起使用。

预期成绩

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;

WHERE 先于 GROUP BY

于 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在分组之前照顾标准移动。要允许不存在的员工或空债务,请使用左外连接

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 将为空,%i%或者 empl.DEBT 从一开始就为空。

为了解决这个问题,可以扩展第一个查询与联合所有旨在检索没有部门的员工。但是有一个问题:我们是否只需要无部门的员工,或者我们考虑或不在名称中包含无i部门的城市工作的员工。我选择了第二种可能。

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;

如果您需要区分没有部门的员工和在没有部门的城市工作的员工i,您可以使用案例

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 回答