Avatar billede straszek Praktikant
27. februar 2011 - 09:52 Der er 13 kommentarer og
1 løsning

Sammentælling

Hej,

Nedenstående sql laver en oversigt over ordre fordelt på land, pr. måned

SELECT COUNT( * ) AS antal, customers_country
FROM  `orders`
WHERE orders.date_purchased LIKE  "%2011-02%"
GROUP BY customers_country
LIMIT 0 , 30

Hvor kan den udvides således at jeg også får en total på hvor meget der er solgt for pr land.

Total for salg ligge i orders_total i felter value, og orders_total har orders_id som fælles "nøgle" med orders.

På forhånd tak
27. februar 2011 - 10:01 #1
Proev:

SELECT COUNT(o.orders_id) AS antal, SUM(t.value) AS value, customers_country
FROM `orders` o JOIN `orders_total` t ON o.orders_id = t.orders_id WHERE orders.date_purchased LIKE  "%2011-02%"
GROUP BY customers_country
27. februar 2011 - 10:14 #2
En lille tilfoejelse.  Hvis du giver orders en alias (siger FROM `orders` o) for at lette JOINen kan du ogsaa forkorte til WHERE o.date_purchased...
Avatar billede straszek Praktikant
27. februar 2011 - 11:21 #3
Virker næsten, og alligevel ikke - orders.date_purchased LIKE  "%2011-02%" bliver nu ignoreret, og i stedet er den en sammentælling for alle ordre:

SELECT COUNT(o.orders_id) AS antal, SUM(t.value) AS value, customers_country
FROM `orders` o JOIN `orders_total` t ON o.orders_id = t.orders_id WHERE o.date_purchased LIKE  "%2011-02%"
GROUP BY customers_country
27. februar 2011 - 11:25 #4
Det er fordi det er mig der er en klokker - date_purchased sidder i orders_total der har alias t, saa det skal vaere WHERE t.date_purchased LIKE "%2011-02%" .  Beklager.
Avatar billede straszek Praktikant
27. februar 2011 - 12:36 #5
Hej,

Nej  - date_purchased er i "orders", så det er ikke der probelmet er
27. februar 2011 - 13:07 #6
Jeg lavede for test, da jeg kom med forslaget, to tabeller straszek_orders og straszek_values med nedenstaaende indhold og denne query:

SELECT COUNT(o.id) AS antal, SUM(t.value) AS value, customers_country
FROM straszek_orders o JOIN `straszek_values` t ON o.id = t.id WHERE o.date_purchased LIKE  "%2011-02%"
GROUP BY customers_country;

og det gav dette resultat som er korrekt ifoelge tabellerne:

antal  value  customers_country 
4 1400 country1
1 600 country2

Hvis den ikke sorterede for dato ville den foerste raekke have vaerdierne 5 1500 country1

Hvad har du i tabellerne?  Hvad er datatypen for datoen?

Her er tabellerne jeg brugte:

straszek_orders
id  customers_country  date_purchased 
1        country1      2011-01-01
2        country1      2011-02-02
3        country1      2011-02-03
4        country1      2011-02-04
5        country1      2011-02-05
6        country2      2011-02-01

straszek_values
id  value 
1      100
2      200
3      300
4      400
5      500
6      600
Avatar billede straszek Praktikant
27. februar 2011 - 13:17 #7
dato_purchase er et date time felt f.x. 2011-02-26 10:43:11

bruger jeg den oprindelig sql:

SELECT COUNT( * ) AS antal, customers_country
FROM  `orders`
WHERE orders.date_purchased LIKE  "%2011-02%"
GROUP BY customers_country
LIMIT 0 , 30


Se resultatet således ud:
1    Australia
1    Austria
3    Belgium
1    Denmark
5    Finland
1    France
30    Germany
1    Greenland
4    Netherlands
3    Norway
1    Russian Federation
9    Sweden
19    Switzerland
1    United Arab Emirates
8    United Kingdom

og det er rigtigt, bortset fra at der mangler sammentælling af beløb


Bruger jeg din:
SELECT COUNT(o.orders_id) AS antal, SUM(t.value) AS value, customers_country
FROM `orders` o JOIN `orders_total` t ON o.orders_id = t.orders_id WHERE o.date_purchased LIKE  "%2011-02%"
GROUP BY customers_country

Se resultatet således ud:

5    524.8000    Australia
6    895.4000    Austria
12    760.3400    Belgium
6    208.4000    Denmark
30    2235.0000    Finland
6    1586.2000    France
164    18365.6000    Germany
4    368.4000    Greenland
24    1007.4000    Netherlands
10    1022.8000    Norway
5    402.0000    Russian Federation
54    3713.8000    Sweden
87    8068.2000    Switzerland
5    192.4000    United Arab Emirates
48    2845.4000    United Kingdom

Og det er som sagt ikke korrekt, da det ikke tager højde for date_pruchase, men medtager alle ordre i sammentællingen
27. februar 2011 - 13:35 #8
Det fatter jeg ikke. 

Det foelgende burde ikke goere nogen forskel, men du kunne da proeve ikke at bruge aliaser, altsaa queryen

SELECT COUNT(*) AS antal, SUM(value) AS value, customers_country
FROM `orders` JOIN `orders_total` ON `orders`.orders_id = `orders_total`.orders_id WHERE date_purchased LIKE  "%2011-02%"
GROUP BY customers_country
Avatar billede straszek Praktikant
27. februar 2011 - 13:42 #9
Det gør ingen forskel
27. februar 2011 - 13:56 #10
Det burde heller ikke goere nogen forskel, men det var da et forsoeg vaerd.

Jeg staar og skal afsted - jeg skal kikke igen i aften (med mindre der kommer en loesning fra anden side i mellemtiden.)
Avatar billede straszek Praktikant
27. februar 2011 - 14:00 #11
helt fint
Avatar billede straszek Praktikant
27. februar 2011 - 14:38 #12
Fejlen er fundet, hver order_id har flere values i order_total, så der skulle en where mere på for at få det rigtige resultat.


Smid et svar
27. februar 2011 - 15:45 #13
Saa grunden til at antal linjer per country var hoejere var ikke at den ikke tog datoer med men at den talte antal af values i order_total.  Jeg kunne heller ikke forstaa hvad der pludselig kunne vaere i vejen med filteret paa dato.

Jeg opretter et svar.
01. marts 2011 - 17:13 #14
strszek, jeg forstod paa dig at problemet i spoergsmaalet er loest.  Forventer du alligevel flere indlaeg i denne traad eller forventer du mere af mig eller har du flere spoergsmaal i sagen?  Ellers vil jeg bede dig lukke spoergsmaalet.  Hvis du ikke mener at kunne acceptere mit svar saa maa du selv oprette et svar og acceptere mig.  Men lad mig ikke haenge i et aabent spoergsmaal.  Please.
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