Zwei Abfragen in einer SQL

  • Moin,


    ich habe ein Problem und einen Denkfehler:


    In months sind Monate definiert, wo etwas bestellt werden kann, bspw für Januar (Spalte "start": 2022-01-01 und "end": 2022-01-31 für Januar.


    In der Tabelle orders sind alle Bestellungen zu finden, in der Spalte "time" ist das Bestelldatum angegeben, gleiches Format wie bei months.


    Meine Frage ist, wie kann ich mit einer SQL-Abfrage die Monate auslesen & Anzeigen, wie viele Bestellungen in den dazugehörigen Monaten getätigt wurden.


    Beispiel:

    SQL
    SELECT * months WHERE month = 'Januar' LEFT JOIN (SELECT COUNT(*) as count FROM orders WHERE time BETWEEN '2022-01-01' AND '2022-01-31'); 

    Das Konzept funktioniert nicht und es folgt ein Syntax Fehler. Andere Ideen blieben auch ohne Erfolg.


    Hat jemand eine Idee?


    Beste Grüße,

    palwal

    PS: Ich kann schon die Mengen an Bestellungen von einen Monat anzeigen, wenn ich für jeden Monat eine Abfrage starte. Ich möchte es aber dynamisch haben und hoffe, mir kann geholfen werden.

    Wer PALWAL-Sternchen vergibt, bekommt aus Prinzip ein Like 😏


    @palwal Donald Trump ist einer der besten Präsidenten welche die USA je hatte, meine Meinung.

  • Wie ist denn deine Tabelle aufgebaut, ich bin etwas verwirrt.


    Es folgt vermutlich ein Syntax-Fehler, weil die Syntax an vielen Stellen fehlerhaft ist.


    Es fehlt ein FROM bei months und ich verstehe nicht, wieso ein JOIN. Also wenn ein subquery, aber auch hier macht das wenig Sinn.


    Du kannst schließlich direkt das Subquery nur aufrufen, das liefert dir schließlich dein Resultat...


    Kannst ja einfach:


    SQL
    SELECT COUNT(*) as count FROM orders WHERE time BETWEEN '2022-01-01' AND '2022-01-31';

    Jahr und Monat kannst ja jeweils dynamisch einfach übergeben und dann erhältst du dein Ergebnis.


    Ich verstehe nicht, was du da noch "dynamischer" machen magst.


    Wenn du doch schon genau das machen kannst, was du magst?!

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

    • Offizieller Beitrag

    Wie ist denn deine Tabelle aufgebaut, ich bin etwas verwirrt.

    Das hatte ich mich auch gefragt und habe versucht die beiden Tabellen grob nachzubauen

    Bildschirmfoto 2021-10-29 um 23.16.35.png


    Angenommen in der Tabelle Orders liegen zwei Bestellungen

    Bildschirmfoto 2021-10-29 um 23.19.15.png


    Dann würde die Query von Kaliber genau das bezwecken was du möchtest

    Bildschirmfoto 2021-10-29 um 23.19.26.png


    „Nicht das, was du nicht weißt, bringt dich in Schwierigkeiten, sondern dass, was du sicher zu wissen glaubst, obwohl es gar nicht wahr ist.“
    Mark Twain

    ---
    ICH BIN NUR HIER UM LEUTE ANZUSCHREIEN

    • Offizieller Beitrag

    Moin.


    Auch wenn die obigen Antworten korrekt sind, möchte ich auch noch eine Lösung hinzufügen.

    Ich glaube, er möchte alle Monate mit den dazugehörigen Werten zurück erhalten.

    Speziell geht es es ihm wohl darum, dass er den Zeitraum der Monate festgelegt hat (wieso auch immer) und diese dementsprechend für Bestellungen begrenzen kann.

    Sollte er dafür einen Anwendungsfall haben, dann sollte er den JOIN in Erwägung ziehen - möglicherweise passt er ja start und end bei den Monaten auch mal an.


    Gehen wir davon aus, dass dein Schema folgendermaßen aufgebaut und gefüllt ist (Spaltennamen usw. musst du dann natürlich auf dein Schema anpassen):


    Um nun von einem Monat die Anzahl der Bestellungen zu erhalten kannst du folgenden Befehl ausführen:

    SQL: BEFEHL
    SELECT name, COUNT(*) as 'Count' FROM months LEFT JOIN orders ON orders.time BETWEEN months.start AND months.end WHERE name = 'Januar';


    Um nun alle Monate mit der Anzahl der zugehörigen Bestellungen zu erhalten:

    SQL: BEFEHL
    SELECT name, COUNT(*) as 'Count' FROM months LEFT JOIN orders ON orders.time BETWEEN months.start AND months.end GROUP BY months.month;


    URL zum FIddle: SQL Fiddle und SQL Fiddle

    Screen: http://img.cireyses.de/owz6gWz0Na1252250.png

  • Ja genau so möchte ich es, ohne zusätzlich in einer anderen SQL die verfügbaren Monate abzufragen. Dein Letzter SQL Befehl funktioniert auch, so wie es sollte, allerdings zeigt er bei allen Monaten mindestens count 1 an, obwohl für Januar 2 und für Februar 1 Bestellung vorhanden ist...demnach müssten eigentlich alle anderen counts auf 0 sein, was bei der SQL-Anweisung nicht der Fall ist.


    Edit: Lösung gefunden!


    SQL
    SELECT month, COUNT(orders.id) as 'Count' FROM months LEFT JOIN orders ON orders.time BETWEEN months.start AND months.end GROUP BY months.month; 

    So funktioniert das wie es sollte


    Vielen Dank für eure Hilfe :)

    Wer PALWAL-Sternchen vergibt, bekommt aus Prinzip ein Like 😏


    @palwal Donald Trump ist einer der besten Präsidenten welche die USA je hatte, meine Meinung.

    Einmal editiert, zuletzt von palwal ()