Avatar billede jakobdo Ekspert
08. marts 2013 - 08:39 Der er 5 kommentarer og
1 løsning

Hvordan laver jeg en COUNT(), som kun skal "tælle nogle" rækker?

Hej,
jeg har følgende tabel struktur:

ORDER (indeholde kunde info osv...)
ORDERLINJER (indeholder KEY til ORDER, produkt, pris, antal osv..)

Jeg vil gerne have en sql som kan sammentælle "omsætning", men samtidig også tælle antal ordrer.

Mit problem pt, er at laver jeg:

SELECT COUNT(order.id) as antal, SUM(orderlinje.pris * orderlinje.antal) AS omsætning FROM order inner join orderlinje on order.id = orderlinje.order_id

Så bliver min ANTAL = antal ordrelinjer, jeg vil "kun" tælle antal ordrer.

Jeg skal jo nok ud i en subquery eller noget, for i "bund og grund" er alt jeg skal have fra tabellen orderlinjer, jo "kun" pris * antal som en sum.
Avatar billede erikjacobsen Ekspert
08. marts 2013 - 08:53 #1
Det er nok muligt at sige COUNT(DISTINCT order.id) - men om det er en go' måde at gøre det på kan jeg ikke lige sige. Du kunne jo evt bare fyre to SELECTer af.
08. marts 2013 - 09:04 #2
Hvis du kun vil have et resultat på en enkelt linje med total antal ordrer og totalen af pris * antal i orderlinje, så kunne det vel gøres således (ikke testet):

SELECT COUNT(*) as antal, (SELECT SUM(pris * antal) FROM orderlinje) as omsætning FROM order
Avatar billede jakobdo Ekspert
08. marts 2013 - 09:10 #3
Christian: Tror det må være løsningen, kunne bare ikke finde den rette syntaks i nat. Så må på den igen med friske øjne. :o)
08. marts 2013 - 11:08 #4
I såfald lægger jeg et svar.
Avatar billede jakobdo Ekspert
08. marts 2013 - 23:22 #5
Jeg var desværre lidt hurtig...

Jeg er nu nået så langt her:

SELECT
  `oc`.`name`,
  SUM(`o`.`delivery_type_price`),
  SUM(`o`.`order_discount`),
  COUNT(`o`.`id`),
  (SELECT SUM(`ol`.`quantity` *  `ol`.`price`) FROM  `orders_orderline`  `ol` WHERE  `ol`.`order_id` = `o`.`id`) as oms
FROM
  `orders_order` `o`
INNER JOIN
  `orders_country` `oc`
ON
  `o`.`customer_country_id` = `oc`.`id`
GROUP BY
  `oc`.`id`

Problemet er så bare, jeg vil gerne have en SUM af denne linje:

(SELECT SUM(`ol`.`quantity` *  `ol`.`price`) FROM  `orders_orderline`  `ol` WHERE  `ol`.`order_id` = `o`.`id`) as oms

og laver jeg f.eks.:

SUM(SELECT SUM(`ol`.`quantity` *  `ol`.`price`) FROM  `orders_orderline`  `ol` WHERE  `ol`.`order_id` = `o`.`id`) as oms
Så fejler min query.

Nogle ideer ?
09. marts 2013 - 18:41 #6
Du vil altså have lavet en oversigt over omsætning per land.  I så fald skal du ikke selecte summen af quantity * pris per o.id men per oc.id.  Der skal du nok have en subselect indeni subselecten, såsom (ikke testet)

(SELECT SUM(quantity*price) FROM orders_orderline WHERE order_id IN(SELECT id FROM orders_order WHERE customer_country_id = oc.id)) as oms

Et par sidebemærkninger:  Jeg ville mene (men har ikke testet min teori,) at du i den første subselect ikke behøber alias for tabellen orders_orderline, fordi du i subselecten kun bruger en tabel, og at du i den anden subselect ikke behøver alias for tabellen orders_order.  Videre kan du, for at gøre det kortere, ændre 'INNER JOIN' til 'JOIN'.

Endnu en sidebemærkning:  Jeg opdagede lidt tilfældigt, at du stillede et nyt spørgsmål inden i dette allerede lukkede spørgsmål, men der er nok ikke mange medlemmer der har set det.  Jeg ville tro det ville have været til din fordel, hvis du havde oprettet et frisk spørgsmål, der så ville blive set af alle.  Skønt jeg ser sammenhængen mellem dit oprindelige spørgsmål og dit sidste spørgsmål, så er der mange nye elementer deri.
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