Oracle sql count()函数?
我对函数count()有问题。我希望它只在特定的条件下计算 我想做的是为每家公司展示公司名称、公司老板姓名以及2010年租金超过三天的数量 所以条件是:2010年租金超过三天 因此,如果公司没有任何符合条件的租金,则不应将其从结果表中删除,而应将其写入零。例如: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------------------
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
子句限制了结果尝试我的最新编辑,现在应该可以工作了-我被原始查询搞糊涂了它没有真正工作(错误:缺少关键字)
,但它给了我一个如何使用案例的想法。对不起,剪切粘贴错误,我留下了一个计数(*)在afterelse 0
中,不应该出现该选项。。现在行吗?GROUPBY子句有问题<代码>代理公司
在括号中定义,因此ag.nom_代理
和ag.nom_responsible
未定义l.duree>3
未将其过滤掉。实际上,我需要它来满足租金超过三天的条件。但是WHERE
子句限制了结果尝试我的最新编辑,现在应该可以工作了-我被原始查询搞糊涂了它没有真正工作(错误:缺少关键字)
,但它给了我一个如何使用案例的想法。对不起,剪切粘贴错误,我留下了一个计数(*)在afterelse 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。