Oracle sql count () функция? - PullRequest
       17

Oracle sql count () функция?

0 голосов
/ 28 октября 2011

У меня проблема с функцией 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):

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)

Есть идеи?Спасибо.

Ответы [ 6 ]

3 голосов
/ 28 октября 2011

Вам необходимо использовать внешнее соединение с таблицей местоположений, чтобы убедиться, что вы всегда извлекаете все прокаты за период независимо от их продолжительности.

Затем посчитайте количество аренды> 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
1 голос
/ 28 октября 2011

Попробуйте следующее (я не пробовал).

По сути, это внешнее соединение между таблицей агентств и арендными платами, сгруппированными по агентству в соответствии с вашим поисковым фильтром.

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 голосов
/ 29 октября 2011

Я нашел запрос. Это дает мне правильную таблицу

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

Спасибо всем за помощь.

0 голосов
/ 28 октября 2011
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 JOIN, который будет извлекать все записи из вашей таблицы агентств независимо от того, есть ли какие-либо подходящие записи в местоположениях

0 голосов
/ 28 октября 2011

Мой быстрый ответ заключается в том, что вы должны сделать левое присоединение, а не внутреннее присоединение, которое вы делаете. Попробуйте это:

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 голосов
/ 28 октября 2011

Используйте предложение, имеющее:

having count(*) > 0
...