SQL lernen

Alles zum SQL-Dialekt

Moderator: Moderatoren

Antworten
kolomophoi
Rookie
Rookie
Beiträge: 3
Registriert: Fr, 19. Nov 2021 19:24

SQL lernen

Beitrag von kolomophoi »

Hallo zusammen,
ich bin gerade dabei SQL zu lernen und habe mir dazu ein Projekt vorgenommen, an dem ich gerade ein wenig herumprobiere. Bei der ein oder anderen Abfrage stehe ich gerade vor einem Problem, da weiss ich noch nicht wie ich das lösen kann, über ein paar Ideen freue ich mich sehr :)

Ich habe zunächst einmal ein ERD gebastelt, ich sende euch mal anbei.

Ich möchte nun Kinder anhand des Geburtsdatums in entsprechende Gruppen zuordnen, je nach Alter. Die Gruppen sind in Bereichen, welche ein Min- und Max. Alter haben. Zur Vereinfachung ist in dem Beispiel Gruppe 1 in Bereich 1, Gruppe 2 in Bereich 2, etc.

Die Regeln sind:
Gruppe1 ist in Bereich 1. In Bereich 1 sind Kinder ab 1 Jahr bis 3 Jahre.
Gruppe2 ist in Bereich 2. In Bereich 2 sind Kinder ab 2 Jahren bis zum 31.07. nachdem es 6 Jahre wurde.
Gruppe3 ist in Bereich 3. In Bereich 3 sind Kinder ab 01.08. nachdem es 6 Jahre wurde bist 12 Jahren.

Das Alter hole ich mir mit

Code: Alles auswählen

SELECT name, vorname, geburtsdatum,
CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, geburtsdatum, GETDATE()), geburtsdatum) > GETDATE()
THEN DATEDIFF(YEAR, geburtsdatum, GETDATE()) - 1
ELSE DATEDIFF(YEAR, geburtsdatum, GETDATE()) END AS 'Alter'
FROM kind
Austrittsdatum Gruppe1 bzw. Eintrittsdatum Gruppe2 kann ich mir auch mit einer DATEADD Funktion holen. Doch wie komme ich an das Austrittsdatum 6 Jahre + darauffolgender 31.07. ?

Das Ziel soll sein, zu einem Stichtag zu sehen, welches Kind sich in welcher Gruppe befindet. Ist das so umzusetzen wie ich mir das vorstelle, oder bin ich hier auf dem Holzweg?

Vielen Dank schon einmal für Hilfestellungen
Dateianhänge
ER Diagramm.png
ER Diagramm.png (181.24 KiB) 2547 mal betrachtet
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: SQL lernen

Beitrag von nightcrawler »

Du hast jetzt nicht dazugeschrieben, welche DBMS Du verwendest.
Bei ADS würde ich eine Function schreiben, welche abhängig von Geburtstag und Stichtag das Alter liefert:

Code: Alles auswählen

create function Altersgruppe(Stichtag date, Geburtsdatum date)
returns string
begin
  declare @alter integer;
  @alter = truncate((date()-geburtsdatum)/365.25,0); //Schaltjahre berücksichtigen ... dürfte nur um den Stichtag rum evtl Abweichungen geben
  if @alter<1 then
    return 'Gruppe <1';
  elseif @alter<=3 then
    return 'Gruppe 1-3';
  elseif @alter<=6 then
    return 'Gruppe 3-6';
  elseif @alter<=12 then
    return 'Gruppe 6-12';
  else return 'Gruppe >12';
  end;
end;
Verwendung:

Code: Alles auswählen

select id, name, vorname, geburtsdatum,
  altersgruppe('2021-07-31',geburtsdatum)
from kind
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
kolomophoi
Rookie
Rookie
Beiträge: 3
Registriert: Fr, 19. Nov 2021 19:24

Re: SQL lernen

Beitrag von kolomophoi »

nightcrawler hat geschrieben: Sa, 20. Nov 2021 11:48 Du hast jetzt nicht dazugeschrieben, welche DBMS Du verwendest.
Ah sorry. Aktuelle probiere ich mich an einer lokalen Microsoft SQL Server Installation.

Danke schonmal für den Lösungsvorschlag - ich werde mal versuchen mich durchzuarbeiten :)
kolomophoi
Rookie
Rookie
Beiträge: 3
Registriert: Fr, 19. Nov 2021 19:24

Re: SQL lernen

Beitrag von kolomophoi »

Ich melde mich nochmal wegen der Abfrage- ich hatte da glaube ich auch einen kleinen Denkfehler drin :)

Ich möchte mir aus der Tabelle Kind zu dem Geburtsdatum das Datum anzeigen lassen, welches der 31.07. nach dem 6. Geburtstag ist.

Die Abfrage die mir das Alter ausgibt nehme ich in eine CASE Abfrage.

WHEN Alter > 6
THEN (...)

Ja - was kommt da rein bei THEN damit der darauffolgende 31.07. kommt?

Bsp. wenn das Kind am 21.11.2021 geboren ist, müsste dort herauskommen 31.07.2028 (wird erst im November 2027 6 Jahre alt, also muss entsprechend der 31.07. aus dem nächsten Jahr genommen werden).
Antworten