Hallo,

Ik ben bezig met het maken van een overzichtstabel van het gebruik bij geneesmiddelen bij ouderen.
In de eerste kolom heb ik de patiëntnummers staan, daarnaast de leeftijd. Daarna komen de kolommen met de verschillende medicijnen. Hierin zijn de hoeveelheden van de verschillende recepten bij elkaar opgeteld uit een receptentabel. Ook heb ik aangegeven dat ik het gebruik wil weten in een bepaalde periode van 100 dagen (deze gegevens staan in de tabel ‘periode’). In de tabel periode staan alle patiënten, maar in de tabel met recepten niet.
Dit heb ik als volgt gedaan:

SELECT
patientnummer, leeftijd,
SUM(IF(MED like 'paracetamol' AND TIMESTAMPDIFF(DAY, xdate, zdate) BETWEEN 0 AND 100, recept, 0)) paracetamol,
(etc..)
FROM periode INNER JOIN recepten USING(patientnummer)
WHERE xdate < ydate
group by anopat

Dit gaat allemaal goed, maar het probleem is dat de patiënten die geen recepten hebben in de receptentabel, niet in mijn tabel komen. Ik zou willen dat deze patiëntnummers er ook gewoon bij staan in de patiëntenkolom en dat er dan in de tabellen van de medicijnen 0 of – komt te staan.
Hoe kan ik dit aanpakken?
Geen INNER JOIN gebruiken, maar een LEFT JOIN. Een INNER JOIN selecteert alleen de records die in beide tabellen een match hebben. Een LEFT JOIN selecteert alle records uit de 'linker' tabel (in dit geval is dat de tabel 'periode') en selecteert daarbij waar mogelijk de records uit de 'rechter' tabel (in dit geval 'recepten'). Zo krijg je dus alle patienten, plus de gegevens van de recepten die wel bekend zijn.
en volgens mij gaat er ook nog iets mis met je regeltje "group by".

Dat hoeft niet tot een foutmelding te leiden, maar wil niet zeggen dat het daarmee de goede resultaten oplevert.

http://wiki.pfz.nl/group-by
Dankjewel

Toevoeging op 30/04/2014 16:46:25:

Ik heb het zojuist even opnieuw geprobeerd, nu met LEFT JOIN ipv INNER JOIN.
Ik krijg nog niet het juiste aantal patiënten.
Wanneer ik de regel WHERE xdate < ydate weghaal, krijg ik wel het juiste aantal patiënten.
Dus alle patiënten die hun medicijnen na datum y hebben gekregen zijn weggelaten uit de tabel.

Is het mogelijk om een dergelijke opdracht te geven: wanneer datum x niet voor datum y ligt, vul dan 0 in.
Ik zou dat dan in de join voorwaarde verwerken, want in feite wil je dus alleen de recepten krijgen waarvan de datum voor een bepaalde datum ligt. De 'lege' waarde krijg je dan automatisch:

SELECT patientnummer, leeftijd,
  SUM(IF(MED like 'paracetamol' AND TIMESTAMPDIFF(DAY, xdate, zdate) BETWEEN 0 AND 100, recept, 0)) paracetamol,
  (etc..)
FROM periode 
LEFT JOIN recepten ON (
  periode.patientnummer = recepten.patientnummer
  AND xdate < ydate
) 
GROUP BY patientnummer, leeftijd, etc
Kan je eens wat meer uitleg geven over wat je nu precies aan het maken bent, bijv wat datumx en datumy nu precies inhouden.
Ik krijg, mede door je andere topics, een beetje het idee dat je de database stukken beter kunt opzetten.
Je hebt het altijd over patienten, maar heb je dan geen patienten table?

Reageren