1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Datenbankdesign vs 'sinnvoller' Abfrage

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von norbert_pdm, 10 September 2019 um 22:54 Uhr.

  1. norbert_pdm

    norbert_pdm Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.

    definiere "halbwegs fortlaufend"

    Dann begrenze via WHERE auf den Monat.


    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.

    Deine Hoffnung hat sich nicht erfüllt.
     
  3. norbert_pdm

    norbert_pdm Benutzer

    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!
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. norbert_pdm

    norbert_pdm Benutzer

    :D:D

    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!
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Nächstes Jahr kommst Du wieder, weil Du ein falsches Resultat hast. Bis dahin.
     
  7. norbert_pdm

    norbert_pdm Benutzer

    Hmm.... Kannst du das näher erklären...?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Nicht sooo ungeduldig, junger Freund ;-)

    Nächstes Jahr erkläre ich Dir das, anhand der Einträge von diesem September und nächsten September.
     
  9. norbert_pdm

    norbert_pdm Benutzer

    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
     
    akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden