Oracle sql count()函数?

Oracle sql count()函数?,sql,oracle,count,conditional-statements,Sql,Oracle,Count,Conditional Statements,我对函数count()有问题。我希望它只在特定的条件下计算 我想做的是为每家公司展示公司名称、公司老板姓名以及2010年租金超过三天的数量 所以条件是:2010年租金超过三天 因此,如果公司没有任何符合条件的租金,则不应将其从结果表中删除,而应将其写入零。例如: company 1 -------------------- BOSS 1-----------------------2 company 2---------------------- BOSS 2------------------

我对函数count()有问题。我希望它只在特定的条件下计算

我想做的是为每家公司展示公司名称、公司老板姓名以及2010年租金超过三天的数量

所以条件是:2010年租金超过三天

因此,如果公司没有任何符合条件的租金,则不应将其从结果表中删除,而应将其写入零。例如:

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
我的sql代码显示第二个表,而不是第一个表。这是我的代码:

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子句):


有什么想法吗?谢谢。

您需要使用locations表的外部联接,以确保您始终在这段时间内获取所有租金,而不管其长度如何

然后计算>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
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

您需要使用locations表的外部联接,以确保始终在该期间内提取所有租金,而不考虑其长度

然后计算>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
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
使用having子句:

having count(*) > 0
使用having子句:

having count(*) > 0

我的快速回答是,你必须做左连接,而不是你做的内部连接。试试这个:

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

我的快速回答是,你必须做左连接,而不是你做的内部连接。试试这个:

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
关键是您需要执行一个左外部联接,该联接将从agences表中检索所有记录,而不管位置中是否有任何匹配的记录

关键是您需要执行一个左外部联接,该联接将从agences表中检索所有记录,而不管位置中是否有任何匹配的记录。请尝试以下操作(我没有尝试)

它基本上是agencies表和rentals表之间的外部联接,根据搜索过滤器按agency分组

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
试试下面的(我没有试过)

它基本上是agencies表和rentals表之间的外部联接,根据搜索过滤器按agency分组

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

我找到了这个问题。它给了我一张合适的桌子

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

谢谢大家的帮助

我找到了查询。它给了我一张合适的桌子

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

谢谢大家的帮助

l.duree>3
没有过滤掉它。实际上,我需要它来满足租金超过三天的条件。但是
WHERE
子句限制了结果尝试我的最新编辑,现在应该可以工作了-我被原始查询搞糊涂了它没有真正工作
(错误:缺少关键字)
,但它给了我一个如何使用
案例的想法。对不起,剪切粘贴错误,我留下了一个计数(*)在after
else 0
中,不应该出现该选项。。现在行吗?GROUPBY子句有问题<代码>代理公司
在括号中定义,因此
ag.nom_代理
ag.nom_responsible
未定义
l.duree>3
未将其过滤掉。实际上,我需要它来满足租金超过三天的条件。但是
WHERE
子句限制了结果尝试我的最新编辑,现在应该可以工作了-我被原始查询搞糊涂了它没有真正工作
(错误:缺少关键字)
,但它给了我一个如何使用
案例的想法。对不起,剪切粘贴错误,我留下了一个计数(*)在after
else 0
中,不应该出现该选项。。现在行吗?GROUPBY子句有问题<代码>代理行
在括号中定义,因此
ag.nom_代理行
ag.nom_responsible
是未定义的问题。
WHERE
子句限制了结果。它给了我与
内部连接相同的表
相同的问题。
WHERE
子句限制了结果。它给了我与
内部连接相同的表
相同的问题。
WHERE
子句限制了结果。它给了我与
内部连接相同的表
相同的问题。
WHERE
子句限制了结果。它给了我与
内部连接相同的表,但我不理解
NVL
子句。对我来说似乎很先进,哈哈。我刚开始学习Oracle sql。谢谢:)@mkab,如果一个值为空,NVL只需用另一个值替换一个值。例如,NVL(3,4)将返回3,因为3不为null,但NVL(null,12)将返回12。由于外部联接在数据集值不匹配的地方产生空值,因此NVL允许我们将它们视为0。它可以工作,但我不理解
NVL
子句。对我来说似乎很先进,哈哈。我刚开始学习Oracle sql。谢谢:)@mkab,如果一个值为空,NVL只需用另一个值替换一个值。例如,NVL(3,4)将返回3,因为3不为null,但NVL(null,12)将返回12。由于外部联接在数据集值不匹配的地方产生空值,因此NVL允许我们将它们视为0。