Avatar billede xited Praktikant
23. maj 2008 - 15:40 Der er 24 kommentarer og
1 løsning

sammentælling af omsætning pr. dag udfra ordretotaler

Hejsa,

Jeg har denne query, der giver mig alle ordretotaler: (ot.value er en integer, date_purchased er af typen 'datetime')

"select ot.value, date_purchased from orders_total ot, orders o where ot_orders_id = o.orders_id and ot.class = 'ot_total' and (o.orders_status > 4 and o.orders_status < 8) order by date_purchased"

Hvordan kan jeg få alle ordretotalerne summeret pr. dag, således at jeg ikke har hver enkelt ordretotal, men en samlet "dagens omsætning". Den skal samtidig køre i en while-løkke, således at f.eks. en måneds omsætning vises fordelt på de enkelte dage.
Avatar billede xited Praktikant
23. maj 2008 - 16:31 #1
Jeg har strikket dette sammen:

        <?php

        $date_only[0] = '';
        echo"<table><tr>";
        $orders_total_query = tep_db_query("select ot.value, date_purchased from orders_total ot, orders o where ot.orders_id = o.orders_id and ot.class = 'ot_total' and (o.orders_status > 4 and o.orders_status < 8) order by date_purchased");
                                                                                                                                                                                                                  while($orders_total = tep_db_fetch_array($orders_total_query)){                                                                                                                                                  $old_date_only = $date_only[0];
                $date_only = explode(" ",$orders_total['date_purchased']);                                                                                                                                                $date_exploded = explode("-",$date_only[0]);
                $days_total += $orders_total['value'];
                $overall_total += $orders_total['value'];
                if($old_date_only != $date_only[0]){
                        $days++;
                        if($bgcolor == 'dddddd'){
                                $bgcolor = 'ffffff';
                        }else{
                                $bgcolor = 'dddddd';
                        }
                        echo"<td bgcolor='".$bgcolor."' valign='bottom'><center><font size='1'>".round($days_total)."<br><img src='images/grey_dot.png' width='15' height='".(round($days_total)/50)."'><b
r>".$date_exploded[2].'/'.$date_exploded[1]."</font></center></td>";
                        $days_total = 0;

                }
//              echo $orders_total['value'].' - '.$date_only[0].'<br>';

        }


        ?>

...som det ses, kan det sikkert gøres *meget* pænere.
Avatar billede w13 Novice
23. maj 2008 - 16:35 #2
Noget i stil med:

"select SUM(ot.value) AS totalsum, date_purchased from orders_total ot, orders o where ot.orders_id = o.orders_id and ot.class = 'ot_total' and (o.orders_status > 4 and o.orders_status < 8) group by ot.value order by date_purchased"

Så ligger datoernes samlede sum i totalsum

Ref.: http://www.w3schools.com/sql/sql_groupby.asp
Avatar billede w13 Novice
23. maj 2008 - 16:36 #3
Det er første gang, jeg roder med "group by"-funktionen selv, og det er meget utestet, så der _kan_ være fejl i. =)
Avatar billede w13 Novice
23. maj 2008 - 16:45 #4
Jeg mener i øvrigt, at du kan skrive:

if($bgcolor == 'dddddd'){
  $bgcolor = 'ffffff';
}else{
  $bgcolor = 'dddddd';
}

som:

$bgcolor = ($bgcolor=='ddd'?'fff':'ddd');

Det kan man i hvert fald i JavaScript, og jeg mener, det er det samme i PHP.

Det skal læses som:

$bgcolor = (HVIS $bgcolor=='ddd' SÅ 'fff' ELLERS 'ddd')

Og grunden til, at jeg skriver ddd og fff og ikke dddddd og ffffff er simpelthen bare, at man sagtens kan forkorte dem på den måde! :)
Avatar billede xited Praktikant
23. maj 2008 - 17:40 #5
De bliver ikke grupperet pr. dag. While-loop'et gennemkøres for hver enkelt ordre med den query du postede. (ligesom den jeg selv lavede!)
Avatar billede xited Praktikant
23. maj 2008 - 17:43 #6
Jeg ved ikke helt hvordan det skal gribes an, da datetime jo er forskellig på alle ordrer. Ordrerne skal "parres" på ens dato, ikke ens timestamp, da der nærmest aldrig vil forekomme 2 ordrer indenfor samme timestamp.
Avatar billede xited Praktikant
23. maj 2008 - 17:44 #7
Jeg bruger: $bgcolor = ($bgcolor=='dddddd'?'ffffff':'dddddd');

$bgcolor = ($bgcolor=='ddd'?'fff':'ddd'); gav et mærkeligt resultat, hvor baggrunden var sort over det hele...
Avatar billede w13 Novice
23. maj 2008 - 17:46 #8
Ja, jeg kan nu se, at det var fordi du ikke havde # foran. Så du sku' bare bruge:

$bgcolor = ($bgcolor=='#ddd'?'#fff':'#ddd');
Avatar billede w13 Novice
23. maj 2008 - 17:46 #9
Jeg lavede en fejl i SQL'en, som skulle være:

"select SUM(ot.value) AS totalsum, date_purchased from orders_total ot, orders o where ot.orders_id = o.orders_id and ot.class = 'ot_total' and (o.orders_status > 4 and o.orders_status < 8) group by DATE(date_purchased) order by date_purchased"
Avatar billede xited Praktikant
23. maj 2008 - 18:07 #10
Det virker fint! tak!
Kan jeg tælle hvor mange ordrer der sammenlægges, så jeg kan vise antal ordrer pr. dag?
Avatar billede xited Praktikant
23. maj 2008 - 18:07 #11
Kan jeg ydermere afgrænse datoen til kun at vise én måned af gangen?
Avatar billede w13 Novice
23. maj 2008 - 18:10 #12
Det kunne du nok med:

"select SUM(ot.value) AS totalsum, date_purchased from orders_total ot, orders o where ot.orders_id = o.orders_id and ot.class = 'ot_total' and (o.orders_status > 4 and o.orders_status < 8) group by MONTH(date_purchased) order by date_purchased"
Avatar billede xited Praktikant
23. maj 2008 - 18:20 #13
Undskyld, det var dårligt formuleret af mig.
Jeg vil gerne have vist alle dage i f.eks. April. altså date_purchased >= 1/5 og date_purchased <= 31/5, så jeg kan tilføje en "kalender" så det er nemt at navigere rundt i.
Avatar billede w13 Novice
23. maj 2008 - 18:22 #14
Ok. Så det er en helt anden SQL, dvs. uafhængigt af den, der skulle gruppere alle datoer i en måned.
Avatar billede w13 Novice
23. maj 2008 - 18:22 #15
Ment som spørgsmål. =)
Avatar billede w13 Novice
23. maj 2008 - 18:24 #16
Nåå, nu forstår jeg. 2 sek.
Avatar billede w13 Novice
23. maj 2008 - 18:26 #17
"select SUM(ot.value) AS totalsum, date_purchased from orders_total ot, orders o where ot.orders_id = o.orders_id and ot.class = 'ot_total' and (o.orders_status > 4 and o.orders_status < 8) and MONTH(date_purchased)=5 group by date_purchased order by date_purchased"
Avatar billede xited Praktikant
24. maj 2008 - 11:12 #18
Kan jeg tælle hvor mange ordrer der sammenlægges, så jeg kan vise antal ordrer pr. dag?
Avatar billede w13 Novice
24. maj 2008 - 15:11 #19
Måske men jeg ved faktisk ikke lige, hvordan det slåes sammen med denne her SQL-sætning. :)
Avatar billede showsource Seniormester
25. maj 2008 - 13:54 #20
Der skal vel også år med?
MONTH(date_purchased)=5 skal så være
DATE_FORMAT(date_purchased, '%Y-%m')='2008-05'

count kan vist gøres så'n:

select SUM(ot.value) AS totalsum, COUNT(ot.id) as orders_ialt ........
Avatar billede xited Praktikant
27. maj 2008 - 10:46 #21
Takker for svar begge to! - Det virker!
Hvordan med point?
Avatar billede w13 Novice
27. maj 2008 - 10:49 #22
Her er et svar fra mig. Og jeg deler gerne med Showsource. =)
Avatar billede xited Praktikant
27. maj 2008 - 15:07 #23
w13> Det var en kommentar! ;)
Avatar billede showsource Seniormester
27. maj 2008 - 15:09 #24
Og jeg springer over her.
Og ved ikke, måske det er en ide at bruge BETWEEN i stedet for DATE_FORMAT
Avatar billede w13 Novice
27. maj 2008 - 15:33 #25
:P
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester