MYSQL Abfrage
Halo an alle MySQL Spezialisten!
Wie kann ich denn am besten folgende Werte abfragen und berechnen?
Ausgang für die ersten Infos die möchte ist die Tabelle "posten" in der die Werte netto, brutto, kosten, datum, kd_id enthalten sind.
Was ich erreichen möchte ist folgendes Ergebnis immer fortlaufend für das ganze Jahr:
Umsatzstärkster Tag = z.B: am 08.04.2016 mit 23.456,00 € netto Umsatz
Höchstes Ergebnis = z.B. am 23.11.2016 mit 10.500,00 €
Höchste Rendite = z.B. am 03.03.2016 mit 35,04 %
Außerdem möchte ich mir gerne für jeden Monat die 15 umsatzstärksten Kunden auf Basis der oben genannten "posten" Tabelle und der Tabelle "kunden" wie folgt anzeigen lassen:
Die Tabellen "posten" und "kunden" sind verknüpft: Tabelle "kunden" Feld id, Tabelle "posten" Feld kd_id.
Januar:
1. Kunde 1 = 123.000,00 €
2. Kunde 2 = 98.560,00. €
...
...
...
Februar:
1. Kunde 1 = 212.000,00 €
2. Kunde 2 = 148.560,00. €
Wer von euch kann das aus dem FF und mag mir helfen?
THX!!!
Wie kann ich denn am besten folgende Werte abfragen und berechnen?
Ausgang für die ersten Infos die möchte ist die Tabelle "posten" in der die Werte netto, brutto, kosten, datum, kd_id enthalten sind.
Was ich erreichen möchte ist folgendes Ergebnis immer fortlaufend für das ganze Jahr:
Umsatzstärkster Tag = z.B: am 08.04.2016 mit 23.456,00 € netto Umsatz
Höchstes Ergebnis = z.B. am 23.11.2016 mit 10.500,00 €
Höchste Rendite = z.B. am 03.03.2016 mit 35,04 %
Außerdem möchte ich mir gerne für jeden Monat die 15 umsatzstärksten Kunden auf Basis der oben genannten "posten" Tabelle und der Tabelle "kunden" wie folgt anzeigen lassen:
Die Tabellen "posten" und "kunden" sind verknüpft: Tabelle "kunden" Feld id, Tabelle "posten" Feld kd_id.
Januar:
1. Kunde 1 = 123.000,00 €
2. Kunde 2 = 98.560,00. €
...
...
...
Februar:
1. Kunde 1 = 212.000,00 €
2. Kunde 2 = 148.560,00. €
Wer von euch kann das aus dem FF und mag mir helfen?
THX!!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 304320
Url: https://administrator.de/contentid/304320
Ausgedruckt am: 15.11.2024 um 23:11 Uhr
20 Kommentare
Neuester Kommentar
Hi,
kurze Nachfrage:
Falls du es selbst probieren möchtest, hier schonmal ein paar Anmerkungen:
Zu Punkt 1: Du musst in der Abfrage die Ergebnisse tagesbasiert gruppieren also die Datensätze Abfragen und mittels GROUP BY nach Datum gruppieren und dann mittels sum die Summe wählen.
Zu Punkt 2: Hier kannst du mit der Funktion MAX das Maximum auswählen.
Zu Punkt 3: Die Rendite kannst du ja auch im select berechnen lassen und das Ergebnis nach den höchsten Werten sortieren.
Zu Punkt 4: Hier musst du einfach die Kundentabelle an die Abfrage joinen. Wenn du die Ergebnisse nach der Kunden-ID gruppierst kannst du die Summe pro Kunde abfragen und absteigend sortieren.
Wenn du nicht weiterkommst, dann sag Bescheid, dann verpacke ich das auch in SQL-Code
Beste Grüße!
Berthold
kurze Nachfrage:
Zitat von @datadexx:
Halo an alle MySQL Spezialisten!
Wie kann ich denn am besten folgende Werte abfragen und berechnen?
Ausgang für die ersten Infos die möchte ist die Tabelle "posten" in der die Werte netto, brutto, kosten, datum, kd_id enthalten sind.
Was ich erreichen möchte ist folgendes Ergebnis immer fortlaufend für das ganze Jahr:
Umsatzstärkster Tag = z.B: am 08.04.2016 mit 23.456,00 € netto Umsatz
Der Umsatz ist dann die Summer der einzelnen Posten des Tages?Halo an alle MySQL Spezialisten!
Wie kann ich denn am besten folgende Werte abfragen und berechnen?
Ausgang für die ersten Infos die möchte ist die Tabelle "posten" in der die Werte netto, brutto, kosten, datum, kd_id enthalten sind.
Was ich erreichen möchte ist folgendes Ergebnis immer fortlaufend für das ganze Jahr:
Umsatzstärkster Tag = z.B: am 08.04.2016 mit 23.456,00 € netto Umsatz
Höchstes Ergebnis = z.B. am 23.11.2016 mit 10.500,00 €
Meinst du damit den höchsten Einzelposten?Höchste Rendite = z.B. am 03.03.2016 mit 35,04 %
Die Rendite bezieht sich auf brutto oder auf netto? (vermutlich die blödeste Frage von mir)Außerdem möchte ich mir gerne für jeden Monat die 15 umsatzstärksten Kunden auf Basis der oben genannten "posten" Tabelle und der Tabelle "kunden" wie folgt anzeigen lassen:
Die Tabellen "posten" und "kunden" sind verknüpft: Tabelle "kunden" Feld id, Tabelle "posten" Feld kd_id.
Januar:
1. Kunde 1 = 123.000,00 €
2. Kunde 2 = 98.560,00. €
...
...
...
Februar:
1. Kunde 1 = 212.000,00 €
2. Kunde 2 = 148.560,00. €
Wer von euch kann das aus dem FF und mag mir helfen?
Ich denke, dein Problem ist lösbar Die Tabellen "posten" und "kunden" sind verknüpft: Tabelle "kunden" Feld id, Tabelle "posten" Feld kd_id.
Januar:
1. Kunde 1 = 123.000,00 €
2. Kunde 2 = 98.560,00. €
...
...
...
Februar:
1. Kunde 1 = 212.000,00 €
2. Kunde 2 = 148.560,00. €
Wer von euch kann das aus dem FF und mag mir helfen?
THX!!!
Falls du es selbst probieren möchtest, hier schonmal ein paar Anmerkungen:
Zu Punkt 1: Du musst in der Abfrage die Ergebnisse tagesbasiert gruppieren also die Datensätze Abfragen und mittels GROUP BY nach Datum gruppieren und dann mittels sum die Summe wählen.
Zu Punkt 2: Hier kannst du mit der Funktion MAX das Maximum auswählen.
Zu Punkt 3: Die Rendite kannst du ja auch im select berechnen lassen und das Ergebnis nach den höchsten Werten sortieren.
Zu Punkt 4: Hier musst du einfach die Kundentabelle an die Abfrage joinen. Wenn du die Ergebnisse nach der Kunden-ID gruppierst kannst du die Summe pro Kunde abfragen und absteigend sortieren.
Wenn du nicht weiterkommst, dann sag Bescheid, dann verpacke ich das auch in SQL-Code
Beste Grüße!
Berthold
Mal so aus dem Bauch heraus und ungetestet: EDIT: Jetzt auch getestet...
Das sollte dir den umsatzstärksten Tag des laufenden Jahres ausgeben.
Für das beste Tagesergebnis:
Für die Tagesrendite:
SELECT
datum,
sum(netto) as tagessumme
FROM posten
WHERE YEAR(datum) = '2016'
GROUP BY datum
ORDER BY tagessumme DESC
LIMIT 0,1
Für das beste Tagesergebnis:
SELECT
datum,
sum(netto) - sum(kosten) as tagesergebnis
FROM posten
GROUP BY datum
ORDER BY tagesergebnis DESC
LIMIT 0,1
SELECT datum,
(sum(kosten) / sum(netto)) as tagesrendite
FROM posten
GROUP BY datum
ORDER BY tagesrendite DESC
LIMIT 0,1
Zitat von @datadexx:
Ich denke mir bei meinem SQL für die 15 besten, das man da mit einer Subquery arbeiten muss? Also eigentlich jeden Monat durchlaufen und mit der Subquery dann die 15 besten ermitteln, aber da hörts bei mir auf
Ich denke mir bei meinem SQL für die 15 besten, das man da mit einer Subquery arbeiten muss? Also eigentlich jeden Monat durchlaufen und mit der Subquery dann die 15 besten ermitteln, aber da hörts bei mir auf
Subquerys sind auch nicht so schwer. Baue deine bisherige Abfrage einfach mal für einen Monat um und dann machst du einfach folgendes:
SELECT
(SELECT .. Abfrage für Januar)
(SELECT ...Abfrage für Februar)
usw.
Stimmt, war mein Fehler...
In diesem Fall darf der Select nur einen Wert zurückgeben...
Ich habs jetzt mal ohne JOIN der Kundendaten gemacht (Angelehnt an deine Abfrage von oben):
Das ergibt mit meinen Beispieldaten dann in etwa sowas:
Damit hättest du nachfolgend für jeden Monat die Top15 hintereinander aufgelistet (Ich hab nur 4 Einträge in der Tabelle).
Wenn du Zwischenüberschriften brauchst, müsstest du mit mehreren Abfragen arbeiten.
In diesem Fall darf der Select nur einen Wert zurückgeben...
Ich habs jetzt mal ohne JOIN der Kundendaten gemacht (Angelehnt an deine Abfrage von oben):
SELECT kunden_id,MONTH(p.datum) AS Monat, SUM(p.netto) AS Umsatz FROM posten p WHERE YEAR(p.datum) = '2016' GROUP BY kunden_id,Monat ORDER BY Monat,Umsatz DESC LIMIT 0,15;
+-----------+-------+--------+
| kunden_id | Monat | Umsatz |
+-----------+-------+--------+
| 1 | 4 | 1579 |
| 2 | 4 | 1518 |
| 1 | 5 | 130 |
| 2 | 5 | 90 |
+-----------+-------+--------+
Wenn du Zwischenüberschriften brauchst, müsstest du mit mehreren Abfragen arbeiten.
Moin datadexx,
sinngemäß ungefähr so:
Grüße
Biber
sinngemäß ungefähr so:
SELECT alles.* from (
SELECT Month(datumsfeld) as Monat, Kunde, sum(feld2) as SummeX, Avg( feld3) as Durchschnitt ...
FROM posten WHERE year(datumsfeld) = 2016 and month(datumsfeld) = 1
GROUP BY Month(datumsfeld), Kunde
ORDER BY 3 desc
Limit 15
UNION ALL
SELECT Month(datumsfeld) as Monat, Kunde, sum(feld2) as SummeX, Avg( feld3) as Durchschnitt ...
FROM posten WHERE year(datumsfeld) = 2016 and month(datumsfeld) = 2
GROUP BY Month(datumsfeld), Kunde
ORDER BY 3 desc
Limit 15
UNION ALL
....
UNION ALL
SELECT Month(datumsfeld) as Monat, Kunde, sum(feld2) as SummeX, Avg( feld3) as Durchschnitt ...
FROM posten WHERE year(datumsfeld) = 2016 and month(datumsfeld) = 12
GROUP BY Month(datumsfeld), Kunde
ORDER BY 3 desc
Limit 15
) alles
Grüße
Biber
Moin datadexx,
bezogen auf mein Beispiel kannst du ja durchaus an die Alles-Ergebnis-Tabelle einen Join über die Kundennr auf deine Kunden machen.
Watt willst du denn da in PHP rumrödeln?
Grüße
Biber
bezogen auf mein Beispiel kannst du ja durchaus an die Alles-Ergebnis-Tabelle einen Join über die Kundennr auf deine Kunden machen.
Watt willst du denn da in PHP rumrödeln?
SELECT Alles.Monat, Kunden.Kundenname, Alles.SummeX, Alles.Durchschnitt ...
FROM (
<siehe oben>
) Alles
join Kunden on Alles.kunde = Kunden.kundennummer
Grüße
Biber
Moin datadexx,
das ist - wie nachgelesen habe, als ich eine handelsübliche Suchmaschine mit "#1221 - Incorrect usage of UNION and ORDER BY" durch die NSA-Rechner gejagt habe, eher ein Implementierungsproblem der mySQL-Zusammenbräter.
Wobei die sogar schreiben, es wäre kein Bug, weil... es gibt gar keinen realen Businesscase für ein UNION ALL mit inneren ORDER BYs.
Anyhow, funktionieren soll es, wenn die einzelnen 12 Monats-SELECTs, die bei mir jeweils mit UNION ALL getrennt sind, zusätzlich mit normalen Klammern abgegrenzt sind.
Beispiel, ein bisschen angepasst an deine Feldnamen :
Ungetestet und soll hauptsächlich das Prinzip zeigen..
Grüße
Biber
das ist - wie nachgelesen habe, als ich eine handelsübliche Suchmaschine mit "#1221 - Incorrect usage of UNION and ORDER BY" durch die NSA-Rechner gejagt habe, eher ein Implementierungsproblem der mySQL-Zusammenbräter.
Wobei die sogar schreiben, es wäre kein Bug, weil... es gibt gar keinen realen Businesscase für ein UNION ALL mit inneren ORDER BYs.
Anyhow, funktionieren soll es, wenn die einzelnen 12 Monats-SELECTs, die bei mir jeweils mit UNION ALL getrennt sind, zusätzlich mit normalen Klammern abgegrenzt sind.
Beispiel, ein bisschen angepasst an deine Feldnamen :
SELECT Alles.Monat, Kunden.Kundenname, Alles.Umsatz FROM (
( SELECT 'Jan' as Monat, Kunden_id, sum(netto) as Umsatz
FROM posten WHERE year(datum) = 2016 and month(datum) = 1
GROUP BY Kunden_id
ORDER BY 3 desc
Limit 15
)
UNION ALL
(
SELECT 'Feb' as Monat, Kunden_id, sum(netto) as Umsatz
FROM posten WHERE year(datum) = 2016 and month(datum) = 2
GROUP BY Kunden_id
ORDER BY 3 desc
Limit 15
)
UNION ALL
( SELECT ...März nach Schema F)
...
UNION ALL
( SELECT ...Dezember nach Schema F )
) Alles
join Kunden on Alles.kunden_id = Kunden.kunden_id
Ungetestet und soll hauptsächlich das Prinzip zeigen..
Grüße
Biber