Summe bilden für einzelne Wochentag

some1new

Benutzer
Beiträge
7
Hallo,

ich bin noch nicht ganz so sicher im Umgang mit MySQL und habe folgende Frage bzw Anliegen:

In einer Table habe ich date und profits.

Nun möchte ich diese in Wochentagen summieren mit einer Besonderheit.
Wenn der dayofweek gleich 'Samstag' ist dann soll er dem Freitag zugeordnet werden.
Ist der Wochentag aus date = 'Sonntag', dann soll der Profit dem Montag zugeschlagen werden.

Wie macht man sowas am besten?

Mit Select Case konnte ich bislang nur die einzelnen Werte (Anzahl) zählen, aber nicht die Summen bilden:

Code:
Select t.profits as Gewinn, count(*) as tester
from (
Select CASE DATE_FORMAT(entrydate,'%w')
   WHEN 1 THEN 'Montag'
   WHEN 2 THEN 'Dienstag'
   WHEN 3 THEN 'Mittwoch'
   WHEN 4 THEN 'Donnerstag'
   WHEN 5 THEN 'Freitag' 
   WHEN 6 THEN 'Freitag'
   WHEN 0 THEN 'Montag'
ELSE 'geht nicht'
END as profits
FROM #__fingerprints) t
GROUP by t.profits order by profits  asc

Leider bekomme ich auch die Ausgabe in der korrekten Reihenfolge Montag- Freitag nicht hin.

Kann mir jemand weiterhelfen?
 
Werbung:
mal mit PostgreSQL gemacht...

Code:
test=# create table some1new (datum date, profits int);
CREATE TABLE
test=*# insert into some1new select current_date + (random()*15)::int, (random()*10)::int from generate_series(1,15) s;
INSERT 0 15
test=*# select * from some1new ;
  datum  | profits
------------+---------
 2018-01-30 |  5
 2018-01-25 |  3
 2018-01-31 |  6
 2018-02-02 |  3
 2018-01-25 |  8
 2018-01-25 |  4
 2018-01-27 |  7
 2018-02-06 |  9
 2018-02-05 |  3
 2018-01-27 |  4
 2018-02-06 |  7
 2018-01-28 |  0
 2018-01-31 |  5
 2018-02-04 |  6
 2018-02-05 |  1
(15 rows)
test=*# with d as (select extract(dow from datum) d, profits from some1new ) select d, case when d = 0 then 'Mon' when d = 1 then 'Mon' when d = 2 then 'Die' when d=3 then 'Mit' when d=4 then 'Don' when d=5 then 'Fri' when d=6 then 'Fri' else 'other' end as dow, sum(profits) from d group by d, dow order by d;
 d | dow | sum
---+-----+-----
 0 | Mon |  6
 1 | Mon |  4
 2 | Die |  21
 3 | Mit |  11
 4 | Don |  15
 5 | Fri |  3
 6 | Fri |  11
(7 rows)
 
Mit PostgreSQL kenne ich mich leider gar nicht aus und ich bin auch an mysqli aufgrund er Webseiten-Struktur gebunden.
Hilft mir leider nicht wirklich weiter, aber danke.

Sieht aber gut aus, bis auf die Tatsache dass noch die Zusammenlegung der doppelten Montage und Freitage fehlt.
 
ah stimmt:

Code:
test=*# with d as (select extract(dow from datum) d, profits from some1new ) select case when d = 0 then 'Mon' when d = 1 then 'Mon' when d = 2 then 'Die' when d=3 then 'Mit' when d=4 then 'Don' when d=5 then 'Fri' when d=6 then 'Fri' else 'other' end as dow, sum(profits) from d group by dow ;
 dow | sum
-----+-----
 Don |  15
 Mon |  10
 Die |  21
 Mit |  11
 Fri |  14
(5 rows)

Man könnte nun noch ein passendes ORDER BY definieren, zu faul ;-)

Gut, Du hast MySQL. Mache Dein CASE und hole auch die andere, zu summierende Spalte, und mache da drüber die Summierung & Gruppierung. Ich mache nix anderes.
 
noch mal mit neuer Tabelle und (ich hoffe) ohne PG-Features:

Code:
test=*# select * from some1new ;
  datum  | profits
------------+---------
 2018-02-05 |  6
 2018-01-25 |  5
 2018-01-27 |  5
 2018-02-02 |  1
 2018-02-01 |  1
 2018-01-29 |  3
 2018-02-07 |  3
 2018-01-26 |  3
 2018-02-01 |  6
 2018-01-27 |  3
 2018-02-06 |  3
 2018-02-05 |  4
 2018-01-24 |  4
 2018-01-27 |  2
 2018-01-25 |  6
(15 rows)

test=*# select case when extract(dow from datum) in (0,1) then 'Montag' when extract(dow from datum) in (5,6) then 'Fri' else 'anderer tag' end, sum(profits) from some1new group by 1;
  case  | sum
-------------+-----
 anderer tag |  28
 Montag  |  13
 Fri  |  14
(3 rows)

Das auf die anderen Tage zu erweitern überlasse ich Dir zur Übung.
 
Code:
Select CASE DATE_FORMAT(entrydate,'%w')
   WHEN 1 THEN 'Montag'
   WHEN 2 THEN 'Dienstag'
   WHEN 3 THEN 'Mittwoch'
   WHEN 4 THEN 'Donnerstag'
   WHEN 5 THEN 'Freitag' 
   WHEN 6 THEN 'Freitag'
   WHEN 0 THEN 'Montag'
ELSE 'geht nicht'
END as weekday
, sum(profitloss)*10000
FROM #__fingerprints
Group by weekday

so scheint es gut zu funktionieren, allerdings kriege ich noch nicht die Wochentage in die gewünschte Reihenfolge
 
Code:
Select CASE DATE_FORMAT(entrydate,'%w')
   WHEN 1 THEN 'Montag'
   WHEN 0 THEN 'Montag'
   WHEN 2 THEN 'Dienstag'
   WHEN 3 THEN 'Mittwoch'
   WHEN 4 THEN 'Donnerstag'
   WHEN 5 THEN 'Freitag' 
   WHEN 6 THEN 'Freitag'
  
ELSE 'geht nicht'
END as weekday
, sum(profitloss)*10000, DATE_FORMAT(entrydate,'%w') as wd_fix
FROM #__fingerprints
Group by weekday order by wd_fix asc
Ah ich habs:

habe noch eine Spalte eingefügt, wo ich die Nummer des Wochentags festhalte und dann danach aufsteigend ordne.
 
Gib Dir Mühe ;-)

Code:
test=*# select * from (select case when extract(dow from datum) in (0,1) then 'Mon' when extract (dow from datum) = 2 then 'Die' when extract(dow from datum) = 3 then 'Mit' when extract(dow from datum) = 4 then 'Don' when extract(dow from datum) in (5,6) then 'Fri' else 'anderer tag' end as dow, sum(profits) from some1new group by 1) x order by case when dow = 'Mon' then 1 when dow = 'Die' then 2 when dow = 'Mit' then 3 when dow = 'Don' then 4 when dow = 'Fri' then 5 end;
 dow | sum
-----+-----
 Mon |  13
 Die |  3
 Mit |  7
 Don |  18
 Fri |  14
(5 rows)

test=*#
 
habe noch eine Spalte eingefügt, wo ich die Nummer des Wochentags festhalte und dann danach aufsteigend ordne.

MySQL-Falle: Du hast 3 Spalten im Resultat, eine davon ist aggregiert, nach der anderen ist gruppiert. Es müssen aber ALLE Spalten ENTWEDER aggregiert ODER gruppiert sein. Deine Abfrage funktioniert nur in MySQL und dort auch nicht in der aktuellsten Version. Sie funktioniert in KEINER ANDEREN Datenbank, weil alle anderen das als syntaktisch falsch erkennen.
 
Werbung:
Zurück
Oben