Jump to content

Alter errechnen und entsprechend zuordnen


Recommended Posts

Hallo zusammen,

ich versuche mich gerade ein wenig in SQL einzulesen und habe mir ein "kleines" Projekt vorgenommen, was ich gerne in einer SQL DB verwirklichen möchte. Bin noch ein wenig dabei Herumzurpobieren wie ich die Tabellen am besten gestalte, hänge jedoch an einer Funktion, bei der ich nicht sicher bin, wie ich es über SQL realisieren kann.

 

Zu der Situation: Ich habe ein Kind, was in einer Betreuung ist. Je nach Alter des Kindes wird es in einer anderen Gruppe betreut.

Gruppe 1 geht bis drei Jahre

Gruppe 2 von drei Jahren bis zu dem Sommer nachdem es 6 Jahre alt wird

Gruppe 3 Ab dem Sommer nachdem es 3 Jahre alt wird bis 12 Jahre

 

Ist es mit SQL möglich, anhand des Geburtsdatums das Kind in den jeweiligen Gruppen zuzuordnen, bzw. die Eintritts- und Austrittsdaten jeweils automatisiert einzutragen?

 

Ich hoffe ich habe mich verständlich ausgedrückt :)

Link to post

Moin,

 

Ja, das ist natürlich möglich. Genau wie bei anderen Programmlōsungen musst du dir hier einen Algorithmus überlegen, der beschreibt, was du brauchst. Dann schaust du, wie du diesen umsetzt.

 

Den Grundstock für deinen Algorithmus hat du ja schon beschreiben. Den musst du nun noch verfeinern - spontan denke ich da an sowas wie: was heißt "Sommer" genau? Wie ist und wann findet die Zuordnung statt? Usw.

 

Zur Umsetzung: wie weit bist du in SQL denn schon gekommen? Welche ersten Ideen hättest du denn, wie du die Umsetzung angehen könntest?

 

Gruß, Nils

Link to post

Erstmal vielen Dank für die Rückmeldung.

 

Du hast recht - Sommer ist da sehr ungenau. Konkret meine ich damit den 31.07. des jeweiligen Jahres.

 

Gruppe 1 bis drei Jahre

Gruppe 2 von drei Jahren bis zu dem 31.07. nachdem es 6 Jahre alt wird

Gruppe 3 Ab dem Sommer nachdem es 3 Jahre alt wird bis 12 Jahre

 

Zum Vorgehen:

Zunächst würde ich mir das Alter geben, bei dem SQL Befehl bin ich mir jedoch nicht sicher und würde mich erstmal an dem Excel Befehl orientieren (wofür ich wahrscheinlich gesteinigt werde :) ). Das setzt natürlich voraus, dass es Funtkionen wie DATEDIF und HEUTE gibt (soweit bin ich noch nicht in SQL).

Angenommen, es ist ähnlich wie in Excel

SELECT DATEDIF('Geburtsdatum', HEUTE) FROM Kind

Anschließend die UPDATE Funktion mit dem Ergebnis des oben stehenden Befehls kombinieren - irgendwie wie folgt

UPDATE Kind
SET Gruppe = 1
IF Alter < 3
            ELSE SET Gruppe = 2
            IF Alter > 3

Würde das in der Richtung so gehen? Wie das Statement lauten für Gruppe 3 (Eintritt ab 01.08. nach dem 6. Geburtstag) lauten soll, bin ich allerdings gerade noch überfragt

Link to post

Moin,

 

dafür dass du mit SQL anscheinend noch nicht so weit bist, hast du dir ein ziemlich komplexes Szenario ausgesucht. Daher empfehle ich dir, dass du dich ranhangelst. Das würde man beim Entwickeln auch machen, wenn man schon weiter ist. Bevor du also irgendwas in die Datenbank schreibst, prüfe erst mal deine Select-Kriterien, ob sie dir in allen Fällen die richtigen Daten zurückgeben. Wenn du das hast, könntest du dir z.B. eine View in der Datenbank bauen, die dir zu jedem Kind angibt, in welche Gruppe es gehört. Ob du das Ergebnis dann überhaupt noch "fest" in eine Tabelle schreiben musst, hängt von der Logik deiner Anwendung ab.

 

DATEDIFF könnte dabei eine hilfreiche Funktion sein; Transact-SQL kennt eine ganze Reihe von Datumsfunktionen. Das ist auch gut dokumentiert - arbeite dich also auch gleich in die Doku ein.

https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-ver15

 

Gruß, Nils

 

Edited by NilsK
Link to post

Ja du hast Recht - ich war mit meinem Kopf noch an einer anderen Baustelle.

 

Das Alter hole ich mir mit

SELECT name, vorname, geburtsdatum, datediff(yy, geburtsdatum, getdate()) AS 'Alter'
FROM kind

Die Gruppe wollte ich entsprechend zuteilen mit

SELECT name, vorname, geburtsdatum, datediff(yy, geburtsdatum, getdate()) AS 'Alter'
FROM kind
UPDATE kind
SET Bereich = 1
WHERE 'Alter' < 3;

Da habe ich allerdings wohl einen Denkfehler drin, denn er nimmt das 'Alter' < 3 nicht an.

Wenn ich dort allerdings eine Funktion einbauen kann, die mir anzeigt, in welche Gruppe das Kind gehört, wäre das natürlich sehr viel besser! Hm, aber wie baue ich so eine View in SSMS?

Link to post

Moin,

 

Eine View baust du mit Create View. Auch dazu findest du das Nötige in der Doku.

 

Dein Update geht deshalb nicht, weil die Tabelle ja keine Spalte "Alter" hat. Die hast du nur in deiner Abfrage virtuell erzeugt. Du könntest aber die Logik, die in deiner Abfrage das Alter errechnet, auch direkt in deinem Update-Statement in der Where-Klausel verwenden.

 

Gruß, Nils

Link to post

Ahja, das DATEDIFF in die Where Klausel zu packen funktioniert prima - Vielen Dank dafür!

 

Nun bekomme ich die Abfrage für Gruppe 1 hin - jedoch für die Austrittsbedingung für Gruppe 2, bzw. Eintrittsbedingung Gruppe 3 (Alter 6 Jahre, der darauffolgende 31.07.) da habe ich so gar keine Idee.

Edited by menslo
Link to post
vor 11 Stunden schrieb menslo:

Wenn ich dort allerdings eine Funktion einbauen kann, die mir anzeigt, in welche Gruppe das Kind gehört, wäre das natürlich sehr viel besser! Hm, aber wie baue ich so eine View in SSMS?

Funktionen kannst Du dir selbst erstellen. Datenbank aufklappen > Programmierbarkeit > Funktionen. Rechtsklick auf Funktionen > neue Skalarwertfunktion. Diese Funktion kannst Du auch in einer StoredProcedure verwenden, ob das in einer View funktioniert weiß ich nicht. Eine StoredProcedure darf NIE mit sp im Namen beginnen, die sp zu Beginn sind für MS reserviert.

Link to post

Moin,

 

da du ja nur drei Fälle zu unterscheiden hast, reicht vielleicht ein CASE-Konstrukt aus. Eine eigene Funktion dafür kann man auch bauen, aber das erscheint mir hier zu hoch gegriffen.

 

[CASE (Transact-SQL) - SQL Server | Microsoft Docs]
https://docs.microsoft.com/de-de/sql/t-sql/language-elements/case-transact-sql?view=sql-server-ver15 
 

Vielleicht noch eine allgemeine Anmerkung: Wie gesagt, für den Anfang ist das Vorhaben schon ziemlich komplex. Ich würde das jetzt erst mal in kleine Teile zerlegen. Für die Einsortierung in wenige Kategorien etwa wirst du im Web -zig Anregungen finden. Bau dir damit erst mal ein paar Abfragen, die die Werte nur ausgeben. Wenn du das drauf hast (da wird es vermutlich mehrere Möglichkeiten geben) gehst du weiter und schaust, welchen der Wege du in deinem Szenario gut weiter verwenden kannst.

 

Gruß, Nils

 

Edited by NilsK
Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...