Ga naar inhoud

Meerdere SELECT in 1 query, 1 met en 1 zonder INNER JOIN


keijers

Aanbevolen berichten

Ben ik weer ;)

Ik heb hetvolgende:

Deze query laat me een overzicht zien van aantal bestellingen + omzet in een bepaalde periode:

SELECT MIN(date_added) AS date_start, MAX(date_added) AS date_end, COUNT(*) AS orders, SUM(total) AS total FROM `" . DB_PREFIX . "order`

In een andere tabel, genaamd 'order_product' staat het aantal bestelde producten van de orders. Nu wil ik in het overzicht van het aantal bestellingen + omzet het aantal producten tonen.

Ik krijg het aantal bestellingen + producten als ik de volgende query uitvoer, het enige probleem is dat dan de omzet niet meer klopt (hij neemt dan per product de totaalprijs, bij een orderprijs van 10 euro voor 3 producten telt hij dan 30 euro)

SELECT MIN(order.date_added) AS date_start, MAX(order.date_added) AS date_end, COUNT(order.order_id) AS orders, COUNT(distinct order.order_id) AS containers, SUM( order.total) AS total FROM `" . DB_PREFIX . "order`

INNER JOIN `order_product` ON order_product.order_id = order.order_id

Wat ik dus eigenlijk wil bereiken is een combinatie van deze 2 query's, waar in query 2 het alleen draait om het aantal producten.

Hoe kan ik 2 select query's in 1 query zetten? Of is dit met een ander soort join op te lossen? Ik heb al distinct erin gegooid maar dat werkt uiteraard niet voor de prijskolom...

Link naar reactie
Delen op andere sites

SELECT column_name(s) FROM table_name1

UNION

SELECT column_name(s) FROM table_name2

SQL UNION Operator

Dus je moet gewoon het Select statement uitvoeren, zoals jij gewent bent, en op het einde zet je er gewoon UNION achter en je begint weer opnieuw.

De code zou ik voor je kunnen typen, maar omdat jij geen SQL gebruik, maar gewoon de code regelregt uit je php haalt, is dat erg moeilijk.

dus laat even weten of je er zo uitkomt, zo niet dan kan ik de code wel voor je uit typen.

PS: De vraag is niet 100% duidelijk, als dit niet klopt ff reageren graag.

Link naar reactie
Delen op andere sites

ik heb nu dit:

SELECT MIN(date_added) AS date_start, MAX(date_added) AS date_end, COUNT(*) AS orders, COUNT(distinct order.order_id) AS containers, SUM(total) AS total FROM `order` WHERE order.order_status_id > '0' AND (DATE(date_added) >= '2012-08-24' AND DATE(date_added) <= '2012-08-31') GROUP BY WEEK(date_added, 1) LIMIT 0,20

UNION SELECT MIN(order.date_added) AS date_start, MAX(order.date_added) AS date_end, COUNT(order.order_id) AS orders, COUNT(distinct order.order_id) AS containers, SUM( order.total) AS total FROM `order` INNER JOIN `order_product` ON order_product.order_id = order.order_id WHERE order.order_status_id > '0' AND (DATE(date_added) >= '2012-08-24' AND DATE(date_added) <= '2012-08-31') GROUP BY WEEK(date_added, 1) LIMIT 0,20

Het enige verschil is dus dat bij orders DISTINCT staat,

Wat hij me nu als output geeft is het volgende, het enige probleem is nu dat hij week 35 er 2 keer neerzet en de totaalprijs van €2.632,00 moet €2.200,50 zijn:

[TABLE=class: list]

[TR]

[TD]Startdatum

[/TD]

[TD=class: left]Einddatum

[/TD]

[TD=class: right]Aantal bestellingen

[/TD]

[TD=class: right]Totaal

[/TD]

[/TR]

[TR]

[TD=class: left][/TD]

[TD=class: left][/TD]

[TD=class: right][/TD]

[TD=class: right][/TD]

[/TR]

[TR]

[TD=class: left]Week: 35 27-08-2012

[/TD]

[TD=class: left]30-08-2012

[/TD]

[TD=class: right]11 producten 11 bestellingen

[/TD]

[TD=class: right]€2.200,50

[/TD]

[/TR]

[TR]

[TD=class: left]Week: 35 27-08-2012

[/TD]

[TD=class: left]30-08-2012

[/TD]

[TD=class: right]12 producten 11 bestellingen

[/TD]

[TD=class: right]€2.632,00

[/TD]

[/TR]

[/TABLE]

Eigenlijk wil ik dit als output:

[TABLE=class: list]

[TR]

[TD]Week: 35 27-08-2012

[/TD]

[TD=class: left]30-08-2012

[/TD]

[TD=class: right]12 producten 11 bestellingen

[/TD]

[TD=class: right]€2.200,50

[/TD]

[/TR]

[/TABLE]

Ik heb al in de query de AS containers AS orders e.d. aangepast naar bijv AS containers2 AS orders2 maar hetzelfde resultaat, steeds 2 rijen die er eigenlijk 1 moeten zijn met de fout info er in...

aangepast door keijers
Link naar reactie
Delen op andere sites

SELECT MIN(date_added) AS date_start, MAX(date_added) AS date_end, COUNT(*) AS orders, COUNT(distinct order.order_id) AS containers, SUM(total) AS total FROM `order`

waarom heb je hier distinct toegevoegt, als je order_id niet uniek is, moet je hier geen distinct toevoegen want dan worden orders die op elkaar lijken niet meegeteld, als hij wel uniek is, hoef je geen distinct toe te voegen.

Ik heb goed gekeken, en waarschijnlijk zit daar je fout, in de eerste code, want dat is ook het enige verschil met je 2de code qua, de hoeveelheid producten krijgen.

SELECT MIN(date_added) AS date_start, MAX(date_added) AS date_end, COUNT(*) AS orders, COUNT(order.order_id) AS containers, SUM(total) AS total FROM `order` WHERE order.order_status_id > '0' AND (DATE(date_added) >= '2012-08-24' AND DATE(date_added) <= '2012-08-31') GROUP BY WEEK(date_added, 1) LIMIT 0,20

dus waarschijnlijk helpt dit.

Link naar reactie
Delen op andere sites

Die distinct staat erbij omdat uit de tabel order_products er meerdere producten zijn bij 1 ordernummer. Dus het ordernummer komt daar vaker voor, en dat wordt geteld vanuit die tabel door de inner join...

Nog een keer voor de duidelijkheid:

Ik wil COUNT(distinct order.order_id) AS containers uit de 2e query de COUNT(distinct order.order_id) AS containers uit de 1e query overschrijven,

of gewoon de 1e query en dan dat hij op basis van die selectie een 2e query uitvoert die het aantal producten telt... maar dat gaat over een andere boeg volgens mij...

Link naar reactie
Delen op andere sites

ik denk dat ik het niet duidelijker kan krijgen, ik bekijk nu gewoon het aantal producten in 1 rij en de totale omzet in de andere rij. Het liefst had ik dat in 1 output maar heel erg is het niet ;-).

De sql wordt door opencart webshop uitgevoerd en volgens mij zit daar ook nog een extra scriptje achter die alle rijen output, dus het wordt wel erg ingewikkeld inderdaad.

In ieder geval bedankt voor je hulp!

Link naar reactie
Delen op andere sites

×
×
  • Nieuwe aanmaken...

Belangrijke informatie

We hebben cookies geplaatst op je toestel om deze website voor jou beter te kunnen maken. Je kunt de cookie instellingen aanpassen, anders gaan we er van uit dat het goed is om verder te gaan.