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

У мене є проблема з count 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

Я хочу щось такого формату (без депозиту):

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)

Будь-які ідеї? Дякую.

0

6 Відповіді

Вам потрібно використовувати зовнішній зв'язок у таблиці місцезнаходжень, щоб переконатися, що ви завжди отримуєте всі орендні внески в період, незалежно від їхньої довжини.

Then count the number of rentals > 3 days.

Спробуйте це:

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
3
додано
l.duree> 3 не фільтрує його. Фактично мені це потрібно, щоб задовольнити умова кількість орендних ставок, що перевищують три дні . Але пропозиція WHERE обмежує результати
додано Автор mkab, джерело
Це не спрацювало (помилка: відсутнє ключове слово) , але він дав мені уявлення про те, як використовувати case .
додано Автор mkab, джерело
Там є проблема з групою за статтю. agences ag визначено в дужках, тому ag.nom_agence і ag.nom_responsble не визначено
додано Автор mkab, джерело
Я знайшов відповідь. Це дає мені правильний стіл. На жаль, я не можу відповісти на моє запитання, тому що у мене менше 100 репутацій. Ось код SELECT ag.nom_agence як NOM_AGENCE, ag.responsable_agence як RESPONSABLE, count (case, коли to_char (l.date_location, 'YYYY') = '2010' та l.duree> 3, а потім 1 end) як NOMBRE FROM agences lag left external link locations l на ag.id_agence = l.id_agence group по nom_agence, responsable_agence
додано Автор mkab, джерело
Дякую всім!!
додано Автор mkab, джерело
спробуйте моє останнє редагування, має працювати зараз - я трохи заплутався за оригінальним запитом
додано Автор StevieG, джерело
вибачте, обрізати та вставити помилку, я залишив рахунок (*) в після else 0 , який не повинен був бути там .. він працює зараз?
додано Автор StevieG, джерело

Я знайшов запит. Це дає мені правильний стіл

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

Дякую за вашу допомогу, усім.

1
додано

Спробуйте наступне (я не спробував це).

Це основний і зовнішній зв'язок між таблицею агентств та орендою, згрупованою за агентством, за вашим пошуковим фільтром.

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
1
додано
Це працює, але я не розумію положення NVL . Здається, просунувся для мене лол. Я тільки почав вивчати Oracle sql. Спасибі, хоча :)
додано Автор mkab, джерело
@mkab, NVL просто замінює значення іншим, якщо значення null. Наприклад, NVL (3, 4) поверне 3, оскільки 3 не є нульовим, а NVL (NULL, 12) повернеться 12. Так як зовнішні об'єднання виробляють нульові значення, коли значення параметрів даних не збігаються, NVL дозволяє нам розглядати їх як 0
додано Автор vc 74, джерело

Моя швидка відповідь полягає в тому, що ви повинні зробити LEFT JOIN, а не INNER JOIN, що ви робите. Спробуйте це:

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
додано
Те ж саме проблема. Застереження WHERE обмежує результати. Це дає мені той самий стіл, що і внутрішнього приєднання
додано Автор mkab, джерело
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
додано
Те ж саме проблема. Застереження WHERE обмежує результати. Це дає мені той самий стіл, що і внутрішнього приєднання
додано Автор mkab, джерело

Використовуйте наявність пункту:

having count(*) > 0
0
додано