Datenbankdesign vs 'sinnvoller' Abfrage

norbert_pdm

Aktiver Benutzer
Beiträge
25
ich hab ein Problem beim Design einer Datenbank bzw. deren Abfrage...

Ich möchte ein Tabelle als Datenbank speichern:

img_table.jpg

Die Namen hole ich aus einer anderen Tabelle (also eigentlich nur ID).
Die Tage liegen als Datum vor.... Und sind halbwegs fortlaufend bis maximal 1 Monat.

Meine Idee war jetzt folgenden:

tbl_anwesenheit:
tbl_aw_ID
tbl_aw_childID
tbl_aw_date
tbl_aw_kategorie​

Soweit ist alles klar.
Die Menge der Tage wollte ich mit count über die tbl_aw_childID abfragen.
ABER:
Es kann vorkommen, dass der Name weiter 'unten' wieder mit einem neuen Datum (sprich neuer Monat) auftaucht.

Wie kann ich nun das Design ändern, so dass es 'Sinn' macht oder kann man die Abfrage so ändern, dass er nur die ID zählt, die in einem bestimmten Zeitraum liegen?

Ich hoffe, dass das nicht all zu verwirrend ist und hoffe ein bisschen auf eure Hilfe :)

VG, Norbert
 
Werbung:
ich hab ein Problem beim Design einer Datenbank bzw. deren Abfrage...

Ich möchte ein Tabelle als Datenbank speichern:

Eine Datenbank enthält Objekte wie z.B. Tabellen, aber auch Views, Indexe, Stored Procs etc. Eine "Tabelle" als "Datenbank" abzuspeichern ist also lediglich eine Nebelkerze.

Anhang anzeigen 1384

Die Namen hole ich aus einer anderen Tabelle (also eigentlich nur ID).
Die Tage liegen als Datum vor.... Und sind halbwegs fortlaufend bis maximal 1 Monat.

definiere "halbwegs fortlaufend"

Meine Idee war jetzt folgenden:

tbl_anwesenheit:
tbl_aw_ID
tbl_aw_childID
tbl_aw_date
tbl_aw_kategorie​

Soweit ist alles klar.
Die Menge der Tage wollte ich mit count über die tbl_aw_childID abfragen.
ABER:
Es kann vorkommen, dass der Name weiter 'unten' wieder mit einem neuen Datum (sprich neuer Monat) auftaucht.

Dann begrenze via WHERE auf den Monat.


Wie kann ich nun das Design ändern, so dass es 'Sinn' macht oder kann man die Abfrage so ändern, dass er nur die ID zählt, die in einem bestimmten Zeitraum liegen?

Da wir Deine geheime Abfrage nicht kennen, können wir Dir auch nicht sagen, wie Du diese abändern könntest. Typisches Henne-Ei-Problem.

Ich hoffe, dass das nicht all zu verwirrend ist

VG, Norbert

Deine Hoffnung hat sich nicht erfüllt.
 
Hallo, hallo akretschmer,

du hast recht... ;-)

Hier jetzt mal komplett alles...

Die Beispieltabelle:

Code:
CREATE TABLE tbl_anwesenheit (
  tbl_anwesenheit_ID INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
  tbl_aw_name TEXT  NULL  ,
  tbl_aw_day DATE  NULL  ,
  tbl_aw_kategorie TEXT  NULL    ,
PRIMARY KEY(tbl_anwesenheit_ID));

Gefüttert ist sie mit folgenden Daten:

Code:
INSERT INTO `tbl_anwesenheit` (`tbl_anwesenheit_ID`, `tbl_aw_name`, `tbl_aw_day`, `tbl_aw_kategorie`) VALUES
(1, 'Max', '2019-09-02', 'X'),
(2, 'Max', '2019-09-04', '-'),
(3, 'Max', '2019-09-06', 'X'),
(4, 'Erwin', '2019-09-02', 'X'),
(5, 'Erwin', '2019-09-04', 'KT'),
(6, 'Max', '2019-08-02', 'X'),
(7, 'Max', '2019-08-05', 'X'),
(8, 'Max', '2019-08-07', '-');

Meine bisherige Abfrage:
Code:
SELECT
    COUNT(`tbl_aw_day`), `tbl_aw_name`
FROM
    `tbl_anwesenheit`
GROUP BY
    tbl_aw_name

liefert mir völlig korrekt und richtig
2 Erwin
6 Max

Mein Versuch die Abfrage auf den September zu begrenzen, klappt leider nicht:
Code:
SELECT
    COUNT(`tbl_aw_day`), `tbl_aw_name`
FROM
    `tbl_anwesenheit`
GROUP BY
    tbl_aw_name
WHERE
    tbl_aw_day >= '2019-09-01 00:00:00' AND tbl_aw_day <= '2019-09-30 00:00:00'

Und da liegt mein Problem....
Ich möchte zählen, wie viel Einträge es (zB für Max) im September gibt.

Vielen Dank für deine Hilfe!
 
Google mal nach der Fehlermeldung "klappt nicht". Erster Treffer ;-)

Code:
test=*# select count(tbl_aw_day), tbl_aw_name from tbl_anwesenheit where tbl_aw_day >= '2019-09-01 00:00:00' AND tbl_aw_day <= '2019-09-30 00:00:00' group by tbl_aw_name;
 count | tbl_aw_name
-------+-------------
     3 | Max
     2 | Erwin
(2 rows)

test=*#

Hint: es gibt eine Reihenfolge, wann man im Select WHERE, GROUP BY etc. anbringen darf.
 
Google mal nach der Fehlermeldung "klappt nicht". Erster Treffer ;-)

:D:D

Code:
test=*# select count(tbl_aw_day), tbl_aw_name from tbl_anwesenheit where tbl_aw_day >= '2019-09-01 00:00:00' AND tbl_aw_day <= '2019-09-30 00:00:00' group by tbl_aw_name;
 count | tbl_aw_name
-------+-------------
     3 | Max
     2 | Erwin
(2 rows)

test=*#

Hint: es gibt eine Reihenfolge, wann man im Select WHERE, GROUP BY etc. anbringen darf.

Danke für deine Hilfe!!
Jetzt klappt es... :cool:

Und ich hab es sogar noch ein bisschen vereinfacht (hätte ich auch vorher drauf kommen können... ;))

Code:
SELECT
    COUNT(`tbl_aw_day`), `tbl_aw_name`
FROM
    `tbl_anwesenheit`
WHERE
    MONTH(tbl_aw_day) = 9
GROUP BY
    tbl_aw_name

Wie gesagt: Ich danke dir!
 
Nicht sooo ungeduldig, junger Freund ;-)

Nächstes Jahr erkläre ich Dir das, anhand der Einträge von diesem September und nächsten September.
 
Werbung:
Vor den Kopf schlag... Oh Man.. Stimmt ja ...
Also beides. Jahr und Monat... ;-)

Der Vollständigkeit halber hier dann so:

Code:
SELECT
    COUNT(`tbl_aw_day`), `tbl_aw_name`
FROM
    `tbl_anwesenheit`
WHERE
    MONTH(tbl_aw_day) = 9 AND YEAR(tbl_aw_day) = 2019
GROUP BY
    tbl_aw_name
 
Zurück
Oben