Datum und GROUP BY

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datum und GROUP BY

    Hallo zusammen,

    habe einen table, der unter anderem die column "tstamp" enthält. Dort sind - wie der Name schon sagt - timestamps im UNIX-timestamp-format drin (0000-00-00 00:00:00).

    Jetzt möchte ich Auswertungen gruppiert nach Monat machen und zwar derart, dass die Form immer "YYYY-MM" lautet, also z.B. 2010-03 für März 2010.

    Wie aber kann ich YEAR(x) und MONTH(y) miteinander kombinieren, und zwar nicht "nur" auf String-Ebene, sondern eben auch auf der logischen Ebene?

    Danke und Grüße,
    Chris

  • #2
    Code:
    SELECT
        DATE_FORMAT(spalte, '%Y-%m') AS monat
    FROM
        tabelle
    GROUP BY
        YEAR(spalte), MONTH(spalte)
    Zuletzt geändert von h3ll; 11.03.2010, 22:14.

    Kommentar


    • #3
      Danke, h3ll! Aber das ist mir schon klar, meine Problembeschreibung ist einfach Mist, sorry! ;-)

      Wie bekomme ich die beiden Teile dann ZUSAMMEN in ein Feld? Also wie geschrieben, z.B. "2010-01", "2010-02", "2010-03"...?


      EDIT: Problem gelöst! CONCAT_WS() erledigt den Job!
      Zuletzt geändert von squirrelcgn; 11.03.2010, 22:16.

      Kommentar


      • #4
        Möchte noch eine kleine Erweiterung vornehmen:

        Es werden ja momentan "nur" solche Monate gelistet, die auch tatsächlich existieren (bzw. für die auch tatsächlich Zeilen existieren). Anders formuliert: es erscheint nur ein "2010-02", wenn für den Februar 2010 auch mindestens eine Zeile existiert... logisch. (Ich gebe also immer den Monat an (2010-02) und daneben werden alle Zeilen, die zu diesem Monat gehören gezählt.)

        Wie kann ich aber jetzt auch solche Monate auflisten, zu denen KEINE Zeile existiert? Also wie kann ich es hinkriegen, dass wenn es KEINE Zeile für Februar 2010 gibt, dort "2010-02" => "0" steht (also einfach "0" als Count). (Ziel: habe immer ein Zeitintervall von mehreren Monaten und möchte auch für jeden Monat einen Eintrag haben, auch wenn dieser Eintrag "0" ist.)

        Das ist eine grundsätzliche Frage, aber wäre super, wenn mir jemand hier eine "good practice" verrät, vielleicht sogar aus eigener Erfahrung?

        Danke und LG,
        Chris
        Zuletzt geändert von squirrelcgn; 11.03.2010, 22:37.

        Kommentar


        • #5
          Es wäre bad practice, datenbank-seitig Daten „erfinden“ zu wollen, die einfach nicht vorhanden sind.

          Wenn du das nur bei der Ausgabe haben willst - dann durchlaufe einfach den Zeitraum in einer Schleife. Wenn es einen Eintrag aus der Datenbank für den Monat gibt, gib den zugehörigen Wert aus - und sonst eine Null.
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Das ist wah(r)! ;-) Danke!

            Ich will natürlich die DB nicht verändern, sondern nur einen Report generieren. Will aber OHNE PHP auskommen, mit PHP ist das ganze ein Kinderspiel...

            Aber es gibt keine "offziellen" for-/while-Schleifen in MySQL, oder?

            Kommentar


            • #7
              Zitat von squirrelcgn Beitrag anzeigen
              Aber es gibt keine "offziellen" for-/while-Schleifen in MySQL, oder?
              Doch, aber nur innerhalb von Triggers, Stored Procedures und Stored Functions. In deinem Falle wäre das zwar ein Weg, aber der ist so dreckig, dass ich dir nur raten kann, trotzdem PHP zur Hand zu nehmen.
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Kommentar


              • #8
                Danke, Amica. Aber das klingt für mich irgendwie total übertrieben / wie mit "Kanonen auf Spatzen geschossen". Will weder TRIGGER/STORED... noch PHP verwenden. Das MUSS gehen... ;-)

                Habe aber noch eine weitere Idee: ich erstelle eine "temporäre Tabelle", die ALLE Monate meines betrachteten Intervall enthält (also sowohl die, bei denen COUNT() > 0, also auch die bei denen COUNT() = 0). Dann mache ich ein JOIN über meine ursprüngliche Tabelle und die temp-Tabelle und FERTIG.

                Sieht jemand ein Problem?
                Zuletzt geändert von squirrelcgn; 12.03.2010, 16:39.

                Kommentar


                • #9
                  Stehe kurz vor der Lösung des Problems. Aber jetzt brauche ich nochmal einen Tipp (oder vielleicht sogar Tritt)... ;-)

                  (1.) Tabelle "base"




                  (2.) Abfrageergebnis




                  FRAGE: wie gestalte ich einen JOIN so, dass das Result wie folgt aussieht:

                  2006-07 0
                  2006-08 0
                  2006-09 0
                  2006-10 6
                  2006-11 0
                  2006-12 2
                  ...

                  also bei den Zeilen, zu denen kein COUNT existiert (der COUNT also 0 ist) soll auch "0" eingetragen werden...

                  Danke für jeden Tipp!

                  LG,
                  Chris

                  Kommentar


                  • #10
                    Du kombinierst diese "base"-Tabelle über einen LEFT JOIN mit der anderen.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar

                    Lädt...
                    X