08. marts 2013 - 08:39Der 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.
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
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.
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
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.
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.
Synes godt om
Ny brugerNybegynder
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.