Oracle sql 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

My 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 оны сүзгіден өткізбейді. Іс жүзінде маған шартты 3 күннен артық жалға алудың қанағаттандыруы қажет . Бірақ WHERE тармағы нәтижелерді шектейді
қосылды автор mkab, көзі
<�Код> (қате: кілт сөзді жоқ) жұмыс істемесе де, case дегенді қалай қолдануға болатындығы туралы маған түсінік берді.
қосылды автор mkab, көзі
Тармақпен тармақ бойынша проблема бар. agences ag сөзі жақшада анықталған, сондықтан ag.nom_agence және ag.nom_responsble анықталмаған
қосылды автор mkab, көзі
Мен жауапты таптым. Бұл маған дұрыс үстелді береді. Өкінішке орай, мен өз сұрағыма жауап бере алмаймын, себебі менің 100-ден аса репутациясы бар. NOM_AGENCE, ag.responsable_agence ретінде RESPONSABLE ретінде SELECT ag.nom_agence коды, (егер, to_char (l.date_location, 'YYYY' = '2010' және l.duree> 3, содан кейін 1 соң), NOMBRE FROM ag ag.id_agence = l.id_agence тобында nom_agence, responsable_agence бойынша біріктірілген орындардан l қалдырылды.
қосылды автор 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 мәні бос болса ғана мәнді екіншіге алмастырады. Мысалы, NVL (3, 4) 3-тен 3-ке қайтарылмайды, бірақ NVL (NULL, 12) 12 қайтарады. Сыртқы қосылыстар деректер жиынтығының мәніне сәйкес келмейтін бос мәндерді шығарады, NVL оларды 0.
қосылды автор vc 74, көзі

Менің жылдам жауаптарым - бұл сіз жасайтын ИНТЕР ЖОЛ емес, СОЛ ЖАҚТЫҢ керек. Мынаны көріңіз:

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
қосылды