[lug-ld] SQL anyone?

Klaus Wünschel kwj at gmx.de
Mi Feb 26 10:13:33 CET 2014


Hallo Ekki,

eine in der Feldliste berechnete Spalte kannst du nicht in der
WHERE-Clause des selben Statements verwenden, da die Restriktion vorher
ausgewertet wird. Du müsstest also noch ein Select außen
rum setzen.

In deinem Beispiel wird der RANK im inneren Select tatsächlich falsch
berechnet. Offensichtlich wird die Sortierung erst später angewandt
als von mir vermutet.

Also noch einmal ein Select außen rum:

http://sqlfiddle.com/#!2/eb7c96/24

Gruß
Klaus

Am Wed, 26 Feb 2014 00:11:30 +0100
schrieb "Ekki Plicht (DF4OR)" <ekki at plicht.de>:

> Also so weit habe ich das jetzt:
> http://sqlfiddle.com/#!2/eb7c96/1/0
> 
> Die Sortierung des inner select ist Woche ASC, Summe(Preis) DESC.
> 
> 
> Das Ergebnis sieht schon fast so aus wie ich das haben will, alleine
> die Begrenzung auf die Top5 Ränge will nicht gehen.
> Obwohl brav eine Column 'Rank' ausgegeben wird bekomme ich einen
> "Unknown column 'Rank' in 'where clause'" wenn ich nach dem
>     ) x
> 
> diese Zeile einfüge:
>     WHERE Rank <= 5
> 
> So ganz verstehe ich das nicht, muss ich gestehen...
> 
> 
> Wenn ich die Query auf meinen echten Daten (und ohne die WHERE clause)
> ausführe kann ich auch sehen, dass das Zurücksetzen des Rank Counters
> funktioniert. In der ersten Woche werden 584 verschiedene Artikel
> verkauft, dann beginnt die 2 Woche wieder mit dem Artikel mit dem
> höchsten Umsatz und Rank #1 usw.
> 
> 
> So, jetzt gehe ich aber erstmal ins Bett.
> 
> Gruß,
> Ekki
> 
> 
> 
> 2014-02-25 23:54 GMT+01:00 Klaus Wünschel <kwj at gmx.de>:
> > Der Code zur Errechnung der Variablen wird, soweit ich das
> > verstanden habe, in der Reihenfolge ausgeführt, in der MySQL die
> > Ergebnismenge abruft. Diese wäre in meinem Beispiel durch die
> > Sortierung des inneren Selects vorgegeben (ORDER BY...). Wie ist
> > dein inneres Select sortiert?
> >
> > Gruß
> > Klaus
> >
> > "Ekki Plicht (DF4OR)" <ekki at plicht.de> schrieb:
> >>Ja, das mit dem Jahr habe ich auch gesehen. Ich habe mir so geholfen
> >>das ich die Abfrage erstmal anur auf ein Jahr beschränkt habe :) So
> >>laufen die Tests auch schneller, immerhin sind in den echten
> >>Tabellen ca. eine Million Einträge drin. Da dauert eine Abfrage
> >>nervend lange zum Testen.
> >>
> >>
> >>Mein Problem ist, das der Rank noch nicht hinhaut. Du inkrementierst
> >>den Rank, wenns die gleiche Woche ist, aber unabhängig von der
> >>Summe. Dadurch wird der Rang absolut zufällig vergeben, bzw. (ich
> >>spekuliere) in der Reihenfolge in der die Zeilen chronologisch vor
> >>dem Sortieren aus der Tabelle kommen.
> >>
> >>Ich mache das jetzt so, das ich im Inner Select erstmal nur die
> >>gruppierte Liste ausgeben lasse, sortiert nach Woche ASC und Summe
> >>DESC. Das Outer select vergibt dann einen Rang indem es einfach
> >>raufzählt, und nur jeweils die ersten 5 haben will. Mal gucken ob
> >>das so geht...
> >>
> >>Gruß,
> >>Ekki
> >>
> >>
> >>
> >>2014-02-25 22:37 GMT+01:00 Klaus Wünschel <kwj at gmx.de>:
> >>> Hallo Ekki,
> >>>
> >>> was bei der MySQL-Variante spontan auffällt: Natürlich ist die
> >>> Gruppierung nach Woche ohne Berücksichtigung des Jahres Quatsch,
> >>> da
> >>man
> >>> so die Wochen verschiedener Jahre in einen Topf wirft. Statt
> >>> week(datum) kannst du da date_format(datum, '%w.%Y') nehmen:
> >>>
> >>> http://sqlfiddle.com/#!2/5433c/6
> >>>
> >>> Ansonsten können wir bei Bedarf ja nochmal was "fiddeln" ;-)
> >>>
> >>> Gruß
> >>> Klaus
> >>>
> >>> Am Tue, 25 Feb 2014 21:54:41 +0100
> >>> schrieb "Ekki Plicht (DF4OR)" <ekki at plicht.de>:
> >>>
> >>>> Und nochmal ich... :)
> >>>>
> >>>> Zu früh gefreut :(
> >>>>
> >>>> Leider tut die Abfrage doch nicht das was sie soll, sorry. Aber
> >>>> ich denke ich habe damit erstmal genug Hinweise bekommen, wie
> >>>> man sowas grundsätzlich löst und werde von da aus mal alleine
> >>>> weiterbasteln.
> >>>>
> >>>> Danke nochmal!
> >>>>
> >>>> Ekki
> >>>>
> >>>>
> >>>> 2014-02-19 14:46 GMT+01:00 Klaus Wünschel <kwj at gmx.de>:
> >>>> > Hallo Christoph,
> >>>> >
> >>>> > das Ranking der Artikel innerhalb des Monats fehlt noch, um
> >>>> > jeweils die 5 Topseller herauszufiltern. Hier das angepasste
> >>>> > Statement:
> >>>> >
> >>>> > http://sqlfiddle.com/#!2/5433c/3
> >>>> >
> >>>> > Ginge alles viel eleganter, wenn's nicht MySQL wäre:
> >>>> >
> >>>> > http://sqlfiddle.com/#!4/7238e/16
> >>>> >
> >>>> > Gruß
> >>>> > Klaus
> >>>> >
> >>>> > Am Wed, 19 Feb 2014 12:54:52 +0100
> >>>> > schrieb Christoph Maya <christoph.maya at gmail.com>:
> >>>> >
> >>>> >> Eii, der generiert immer neue Links :)
> >>>> >> http://sqlfiddle.com/#!2/15f8c7/1
> >>>> >>
> >>>> >>
> >>>> >> 2014-02-19 12:35 GMT+01:00 Christoph Maya
> >>>> >> <christoph.maya at gmail.com>:
> >>>> >>
> >>>> >> > Glaube das passt: http://sqlfiddle.com/#!2/e1129b/1
> >>>> >> >
> >>>> >> > Aber nur schnell zusammen gefrickelt (=
> >>>> >> >
> >>>> >> > Grüße
> >>>> >> >
> >>>> >> >
> >>>> >> > 2014-02-19 9:43 GMT+01:00 Christoph Maya
> >>>> >> > <christoph.maya at gmail.com>:
> >>>> >> >
> >>>> >> > Hallo Ekki,
> >>>> >> >>
> >>>> >> >> wenn ich es richtig verstehe, sollte es mit GROUP BY und
> >>HAVING
> >>>> >> >> gehen: http://www.sqldocu.com/four/groupby.htm#having
> >>>> >> >>
> >>>> >> >> Ansonsten: können wir heute Abend mal Live hacken? Hab so
> >>>> >> >> was ähnliches mal gemacht, nur ohne Join. Da ich auch kein
> >>>> >> >> SQL Pro bin, hab ich mich Stück für Stück "ran getastet",
> >>>> >> >> bis die richtigen Ergebnisse da waren :)
> >>>> >> >>
> >>>> >> >> Bzw. geb uns mal ein SQL Fiddle: http://sqlfiddle.com/ dann
> >>>> >> >> können alle gleichzeitig hacken (=
> >>>> >> >>
> >>>> >> >> Grüße
> >>>> >> >>
> >>>> >> >>
> >>>> >> >> 2014-02-18 23:43 GMT+01:00 Klaus Wünschel <kwj at gmx.de>:
> >>>> >> >>
> >>>> >> >> Hallo Ekki,
> >>>> >> >>>
> >>>> >> >>> das ist bitter ;-) Vielleicht hilft dir der folgende
> >>>> >> >>> Artikel, um das Problem auf "MySQL-Art" zu lösen:
> >>>> >> >>>
> >>>> >> >>> http://www.sqlines.com/mysql/how-to/get_top_n_each_group
> >>>> >> >>>
> >>>> >> >>> Gruß
> >>>> >> >>> Klaus
> >>>> >> >>>
> >>>> >> >>> "Ekki Plicht (DF4OR)" <ekki at plicht.de> schrieb:
> >>>> >> >>> >Hi Klaus,
> >>>> >> >>> >tja, da habe ich wohl Pech gehabt. Es handelt sich um
> >>>> >> >>> >MySQL
> >>:)
> >>>> >> >>> >
> >>>> >> >>> >Gruß,
> >>>> >> >>> >Ekki
> >>>> >> >>> >
> >>>> >> >>> >
> >>>> >> >>> >2014-02-18 19:52 GMT+01:00 Klaus Wünschel <kwj at gmx.de>:
> >>>> >> >>> >> Hallo,
> >>>> >> >>> >>
> >>>> >> >>> >> nur für den Fall, dass es sich bei der verwendeten
> >>Datenbank
> >>>> >> >>> >> nicht um MySQL handelt...
> >>>> >> >>> >>
> >>>> >> >>> >> Bei PostgreSQL oder Oracle könntest du Window-Functions
> >>zur
> >>>> >> >>> >Ermittlung
> >>>> >> >>> >> des Rangs eines Artikels innerhalb des Monats benutzen,
> >>z.B.
> >>>> >> >>> >>
> >>>> >> >>> >> RANK() OVER (PARTITION BY TO_CHAR(auftragsdatum,
> >>'WW.YYYY')
> >>>> >> >>> >> ORDER BY SUM(preis) DESC)
> >>>> >> >>> >>
> >>>> >> >>> >> Siehe auch
> >>>> >> >>> >>
> >>http://www.postgresql.org/docs/9.1/static/tutorial-window.html
> >>>> >> >>> >>
> >>>> >> >>> >> Damit lassen sich viele Sub-Selects auf einfache Weise
> >>>> >> >>> >> überflüssig machen.
> >>>> >> >>> >>
> >>>> >> >>> >> Gruß
> >>>> >> >>> >> Klaus
> >>>> >> >>> >>
> >>>> >> >>> >> Am Tue, 18 Feb 2014 11:44:00 +0000
> >>>> >> >>> >> schrieb "Wagner, Steffen Tobias"
> >>>> >> >>> >> <Steffen.Tobias.Wagner at sap.com>:
> >>>> >> >>> >>
> >>>> >> >>> >>> Moin,
> >>>> >> >>> >>>
> >>>> >> >>> >>> MySQL:
> >>>> >> >>> >>>
> >>>> >> >>> >>> zum Thema gruppieren (-> GROUP BY WEEK... & SORT BY
> >>>> >> >>> >>> WEEK...): z.b.
> >>>> >> >>>
> >>>http://stackoverflow.com/questions/6710342/mysql-grouping-by-week
> >>>> >> >>> >>>
> >>>> >> >>> >>> Zum Thema Join von mehreren Tabellen (-> INNER JOIN):
> >>>> >> >>> >>> z.B.
> >>>> >> >>> >>> http://www.mysqltutorial.org/mysql-inner-join.aspx
> >>>> >> >>> >>>
> >>>> >> >>> >>> Deine Anforderung sollte problemlos in einer Abfrage
> >>>> >> >>> >>> machbar sein.
> >>>> >> >>> >>>
> >>>> >> >>> >>> Gruß Steffen
> >>>> >> >>> >>>
> >>>> >> >>> >>>
> >>>> >> >>> >>>
> >>>> >> >>> >>> From: lug-ld-bounces at lists.lug-ld.de
> >>>> >> >>> >>> [mailto:lug-ld-bounces at lists.lug-ld.de] On Behalf Of
> >>>> >> >>> >>> Ekki Plicht (DF4OR) Sent: Dienstag, 18. Februar 2014
> >>>> >> >>> >>> 12:31 To: Allgemeine Mailingliste der
> >>>> >> >>> >>> Linux-User-Group Landau Subject: [lug-ld] SQL
> >>>> >> >>> >anyone?
> >>>> >> >>> >>>
> >>>> >> >>> >>>
> >>>> >> >>> >>> Moin.
> >>>> >> >>> >>> Ich bräuchte mal Hilfe bei einer SQL-Abfrage.
> >>>> >> >>> >>>
> >>>> >> >>> >>> Tabelle 1
> >>>> >> >>> >>> id, Auftragsnummer, auftragsdatum
> >>>> >> >>> >>>
> >>>> >> >>> >>> Tabelle 2
> >>>> >> >>> >>> Auftrags-id, Artikel, Preis
> >>>> >> >>> >>>
> >>>> >> >>> >>> Es gibt also viele Aufträge mit jeweils einer oder
> >>mehreren
> >>>> >> >>> >>> Positionen (Artikel).
> >>>> >> >>> >>>
> >>>> >> >>> >>> Ich suche  nun folgendes Ergebnis :
> >>>> >> >>> >>> Woche, Artikel, Preis
> >>>> >> >>> >>>
> >>>> >> >>> >>> Im Klartext : gruppiert nach Woche alle Artikel die in
> >>>> >> >>> >>> dieser Woche verkauft wurden, zusammen gefasst die
> >>>> >> >>> >>> Preise jeden Artikels, sortiert nach den top 5
> >>>> >> >>> >>> Artikeln
> >>>> >> >>> >>>
> >>>> >> >>> >>> Ich will also wissen:
> >>>> >> >>> >>> Welche Artikel waren meine Renner (Top 5) je Woche?
> >>>> >> >>> >>>
> >>>> >> >>> >>> Geht das überhaupt mit einer Abfrage? Ich habe es mit
> >>>> >> >>> >>> sub selects probiert aber nicht hingekommen....
> >>>> >> >>> >>>
> >>>> >> >>> >>> Danke!
> >>>> >> >>> >>> Ekki
> >>>> >> >>> >>
> >>>> >> >>> >> _______________________________________________
> >>>> >> >>> >> lug-ld mailing list
> >>>> >> >>> >> lug-ld at lists.lug-ld.de
> >>>> >> >>> >> http://lists.lug-ld.de/mailman/listinfo/lug-ld
> >>>> >> >>> >_______________________________________________
> >>>> >> >>> >lug-ld mailing list
> >>>> >> >>> >lug-ld at lists.lug-ld.de
> >>>> >> >>> >http://lists.lug-ld.de/mailman/listinfo/lug-ld
> >>>> >> >>>
> >>>> >> >>> _______________________________________________
> >>>> >> >>> lug-ld mailing list
> >>>> >> >>> lug-ld at lists.lug-ld.de
> >>>> >> >>> http://lists.lug-ld.de/mailman/listinfo/lug-ld
> >>>> >> >>>
> >>>> >> >>
> >>>> >> >>
> >>>> >> >
> >>>> >
> >>>> > _______________________________________________
> >>>> > lug-ld mailing list
> >>>> > lug-ld at lists.lug-ld.de
> >>>> > http://lists.lug-ld.de/mailman/listinfo/lug-ld
> >>>> _______________________________________________
> >>>> lug-ld mailing list
> >>>> lug-ld at lists.lug-ld.de
> >>>> http://lists.lug-ld.de/mailman/listinfo/lug-ld
> >>>
> >>> _______________________________________________
> >>> lug-ld mailing list
> >>> lug-ld at lists.lug-ld.de
> >>> http://lists.lug-ld.de/mailman/listinfo/lug-ld
> >>_______________________________________________
> >>lug-ld mailing list
> >>lug-ld at lists.lug-ld.de
> >>http://lists.lug-ld.de/mailman/listinfo/lug-ld
> >
> > _______________________________________________
> > lug-ld mailing list
> > lug-ld at lists.lug-ld.de
> > http://lists.lug-ld.de/mailman/listinfo/lug-ld
> _______________________________________________
> lug-ld mailing list
> lug-ld at lists.lug-ld.de
> http://lists.lug-ld.de/mailman/listinfo/lug-ld