Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL]0 bij geen records

Pagina: 1
Acties:

  • bartgabriels
  • Registratie: April 2005
  • Laatst online: 15-03-2022
Voor een projectje voor een evenement van ons, waarvoor we een aantal zaken willen automatiseren, ben ik op zoek naar een oplossing voor onderstaand probleem:

Ik heb een databank met een aantal taken in:
Voorbeeld:
TaakIDTaakOMSCHRIJVING
1Bonnetjes
2Inkom


Daarnaast is er een 2e tabel, die deze koppelt aan een bepaalde schift:
JobIDJobShiftJobTaak
112
222


Nu wil ik, door middel van een query, een overzichtje hoeveel shiften elke taak wordt uitgevoerd:
Bonnetjes: 0
Inkom: 2

Heb dit eerst geprobeerd door middel van JOINS op het scherm te krijgen. Standaard geeft dit enkel de velden weer die in beide tabellen voorkomen:
Voorbeeld:
code:
1
SELECT TblTaak.TaakOmschrijving, COUNT(TblJob.JobID) FROM TblTaak INNER JOIN TblJob WHERE TaakID = JobTaak;

Dit geeft enkel:
Inkom: 2

Voorbeeld 2:
code:
1
SELECT TblTaak.TaakOmschrijving, COUNT(TblJob.JobID) FROM TblTaak LEFT JOIN TblJob WHERE TaakID = JobTaak;

Dit geeft ook enkel:
Inkom: 2

Ik vermoed dat ik ergens met een UNION moet gaan werken, maar heb geen idee meer (ondertussen al 4 jaar van de schoolbanken, en SQL maakt geen deel uit van mijn prof. takenpakket) hoe dit nu weer werkt ...

Kan iemand een voorzet geven?

  • CyBeRSPiN
  • Registratie: Februari 2001
  • Nu online

CyBeRSPiN

sinds 2001

Left outer join, en "nvl" (of coalesce) gaan je verder helpen. Succes! :)

[ Voor 10% gewijzigd door CyBeRSPiN op 22-08-2010 15:08 ]


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-11 01:01
Programming FAQ - SQL zou je op weg moeten helpen.

  • bartgabriels
  • Registratie: April 2005
  • Laatst online: 15-03-2022
CyBeRSPiN schreef op zondag 22 augustus 2010 @ 15:06:
Left outer join, en "nvl" (of coalesce) gaan je verder helpen. Succes! :)
Doet op het eerst zicht ook niks anders dan de voorgaande query's ...
Programming FAQ - SQL zou je op weg moeten helpen.
Had ik ook al bekeken, echter staan daar geen UNION's in, en heb ik het gevoel dat ik er zonder niet kom ...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Je hebt geen union nodig, enkel een outer join. En die staan toch echt wél omschreven in de aangehaalde FAQ, inclusief voorbeelden die je precies vertellen welke je moet hebben en waarom. ;)

Je gebruikt je joins ook gewoon niet goed. Je joint tabellen ON <iets>, niet WHERE <iets>.

[ Voor 19% gewijzigd door NMe op 22-08-2010 15:21 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • bartgabriels
  • Registratie: April 2005
  • Laatst online: 15-03-2022
Ok, inderdaad geen goed vereenvoudigd voorbeeld geven blijkbaar. In dit geval blijkt outer Join inderdaad te werken ... Dan ga ik even terug naar de tekentafel om te kijken waarom dit niet werkt op mijn uigebreidere databank.

  • bartgabriels
  • Registratie: April 2005
  • Laatst online: 15-03-2022
Ok, blijkbaar te weinig info gegeven ...

Stel nu dat er bij de tabel TblJob een 3e record bijkomt:
321


Dan geeft de query SELECT TblTaak.TaakOmschrijving, COUNT(TblJob.JobID) FROM TblTaak INNER JOIN TblJob WHERE TaakID = JobTaak; volgend resultaat:
Inkom: 1
Bonnetjes: 2

Nu wil ik een overzicht van de taken die voorkomen in shift 1, en als ze niet voorkomen, moet de waarde 0 gegeven worden. Dit werkt volgens mij niet meer met outer join.

De query
code:
1
2
3
4
SELECT TblTaak.TaakOmschrijving, Count(TblTaak.TaakOmschrijving) AS CountOfTaakOmschrijving
FROM TblJOB RIGHT JOIN TblTaak ON TblJob.JobTaak = TblTaak.TaakID
GROUP BY TblTaak.TaakOmschrijving, TblJob.JobShift
HAVING (((TblJob.TestJob)=1));

Geeft nu enkel:
Bonnetjes: 1

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-11 01:01
De voorwaarden die je stelt na WHERE of HAVING worden pas uitgevoerd nadat de join is gedaan, dus het kan inderdaad gebeuren dat je dan een taak helemaal weghaalt. Om dit op te lossen moet je die voorwaarde al eerder opgeven, bij de join (ON ... AND ..) of voor de join (door te joinen tegen een subquery van jobs ipv de hele tabel).

  • Moraelyn
  • Registratie: Januari 2007
  • Laatst online: 12-08-2024
Even kort door de bocht: select taak.taakomschrijving, nvl(count(job.jobid),0) from taak left outer join job on taak.id = job.taak and job.shift = 1.

Afhankelijk van de gebruikte database is de nvl (Oracle) geen nvl, maar bv. een isnull (SQL Server) of iets anders.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

HAVING (((TblJob.TestJob)=1)) veranderen in WHERE TblJob.TestJob = 1 OR TblJob.TestJob IS NULL. En uiteraard vóór de group by zetten.
Moraelyn schreef op zondag 22 augustus 2010 @ 17:47:
Even kort door de bocht: select taak.taakomschrijving, nvl(count(job.jobid),0) from taak left outer join job on taak.id = job.taak and job.shift = 1.

Afhankelijk van de gebruikte database is de nvl (Oracle) geen nvl, maar bv. een isnull (SQL Server) of iets anders.
Daarmee los je het probleem van verdwijnende records niet op. :)

[ Voor 78% gewijzigd door NMe op 22-08-2010 18:13 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Moraelyn
  • Registratie: Januari 2007
  • Laatst online: 12-08-2024
NMe schreef op zondag 22 augustus 2010 @ 18:12:
Daarmee los je het probleem van verdwijnende records niet op. :)
Ik was vergeten een group by er in te zetten. Probeer maar eens (ik heb de right outer verandert in een left outer omdat ik een right outer altijd verwarrend vind om te lezen).

Ik heb het net even nagemaakt in SQL Server om te kijken of ik nu iets over het hoofd zag.

SQL:
1
2
3
4
select t.omschrijving, ISNULL(count(j.id),0)
from taak t
left outer join job j on t.id = j.taak and j.shift = 1
group by t.omschrijving
Pagina: 1