SELECT als SUM uit tabel1 groter is dan waarde uit tabel2
Ik ben bezig met een voorraadbeheer voor ons laboratorium.
Ik heb hier 2 tabellen:
artikel:
artikel_code
artikel_naam
minumum_voorraad
en de rest (niet toe doende)
artikel_batch:
batch
artikel_code
voorraad
Nu wil ik een overzicht maken van alle artikelen waarbij de SUM(voorraad) van alle batches van een artikel_code kleiner is dan de minimum_voorraad die bij dat artikel_code in tabel artikel staat.
ik heb het nu opgelost door eerst alle artikel_code op te halen uit artikel, en in een while voor iedere artikel_code het aantal te bepalen met een SUM(voorraad) in tabel artikel_batch. Als deze voorraad kleiner is dan de minimum_voorraad, wordt de artikel_code weggeschreven in een array.
Toch denk ik dat dit in 1 query moet kunnen, iemand enig idee hoe?
Ik heb al naar IN gekeken, maar ik kom er nog niet helemaal uit
EDIT:
PS, dit is topic 8000 met post 12000 in Databases & SQL
Gewijzigd op 12/01/2011 14:24:48 door Tobias Tobias
Een join zou uitkomst moeten bieden.
Karl Karl op 12/01/2011 14:48:23:
Inderdaad een ordinaire join en dan aangevuld met having en je hoeft dan in php niks meer te processen.Een join zou uitkomst moeten bieden.
Code (php)
1
2
3
4
5
2
3
4
5
SELECT column1, column2, ... column_n, aggregate_function (expression)
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n
HAVING condition1 ... condition_n;
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n
HAVING condition1 ... condition_n;
Er kan mega veel in SQL alleen de kennis ontbreekt te vaak en dan wordt het maar php opgelost ervaar ik dagelijks....
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
SELECT DISTINCT(vobis_artikel.artikel_code),vobis_artikel.min_voorraad FROM vobis_artikel
INNER JOIN vobis_artikel_batch
ON vobis_artikel.artikel_code = vobis_artikel_batch.artikel_code
WHERE
vobis_artikel.min_voorraad
>
(SELECT SUM(aantal) AS tot_voorraad FROM vobis_artikel_batch WHERE vobis_artikel_batch.artikel_code=vobis_artikel.artikel_code)
?>
SELECT DISTINCT(vobis_artikel.artikel_code),vobis_artikel.min_voorraad FROM vobis_artikel
INNER JOIN vobis_artikel_batch
ON vobis_artikel.artikel_code = vobis_artikel_batch.artikel_code
WHERE
vobis_artikel.min_voorraad
>
(SELECT SUM(aantal) AS tot_voorraad FROM vobis_artikel_batch WHERE vobis_artikel_batch.artikel_code=vobis_artikel.artikel_code)
?>
Deze geeft nog 2 problemen:
Hoe krijg ik de waarde van tot_voorraad?
en als een artikel nog geen batches heeft (en dus tot_voorraad 0 zou moeten zijn, wordt deze niet geselecteerd
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$query = mysql_query("
SELECT vobis_artikel.*, SUM(vobis_artikel_batch.aantal) AS voorraad FROM vobis_artikel
LEFT JOIN vobis_artikel_batch
ON vobis_artikel.artikel_code = vobis_artikel_batch.artikel_code
GROUP BY vobis_artikel.artikel_code
HAVING
vobis_artikel.min_voorraad
>
(SELECT SUM(vobis_artikel_batch.aantal) AS voorraad FROM vobis_artikel_batch WHERE vobis_artikel_batch.artikel_code = vobis_artikel.artikel_code)
");
?>
$query = mysql_query("
SELECT vobis_artikel.*, SUM(vobis_artikel_batch.aantal) AS voorraad FROM vobis_artikel
LEFT JOIN vobis_artikel_batch
ON vobis_artikel.artikel_code = vobis_artikel_batch.artikel_code
GROUP BY vobis_artikel.artikel_code
HAVING
vobis_artikel.min_voorraad
>
(SELECT SUM(vobis_artikel_batch.aantal) AS voorraad FROM vobis_artikel_batch WHERE vobis_artikel_batch.artikel_code = vobis_artikel.artikel_code)
");
?>
Dit werkt prima, behalve als van een artikel_code geen bijbehorende batch in de vobis_artikel_batch tabel staat. Alle soorten JOINs al geprobeerd.
Ik kan er evt een aparte SELECT van maken en met UNION in 1 query zetten
enz
Bas Cost Budde op 12/01/2011 17:27:48:
SELECT vobis_artikel.*, SUM(COALESCE(vobis_artikel_batch.aantal, 0)) AS voorraad
enz
enz
Noop, doet het hem ook niet.
Als ik het hele HAVING weghaal, dan reageert de query wel op LEFT en RIGHT JOIN
EDIT
@Bas: Maar je zat heel dichtbij: De positie van de COALESCE klopte niet helemaal.
Het eindresultaat:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$query = mysql_query("
SELECT
vobis_artikel.*,
SUM(vobis_artikel_batch.aantal) AS voorraad
FROM
vobis_artikel
LEFT JOIN
vobis_artikel_batch
ON
vobis_artikel.artikel_code = vobis_artikel_batch.artikel_code
GROUP BY
vobis_artikel.artikel_code
HAVING
vobis_artikel.min_voorraad
>
(SELECT
COALESCE(SUM(vobis_artikel_batch.aantal),0) AS voorraad2
FROM
vobis_artikel_batch
WHERE
vobis_artikel_batch.artikel_code = vobis_artikel.artikel_code)
");
?>
$query = mysql_query("
SELECT
vobis_artikel.*,
SUM(vobis_artikel_batch.aantal) AS voorraad
FROM
vobis_artikel
LEFT JOIN
vobis_artikel_batch
ON
vobis_artikel.artikel_code = vobis_artikel_batch.artikel_code
GROUP BY
vobis_artikel.artikel_code
HAVING
vobis_artikel.min_voorraad
>
(SELECT
COALESCE(SUM(vobis_artikel_batch.aantal),0) AS voorraad2
FROM
vobis_artikel_batch
WHERE
vobis_artikel_batch.artikel_code = vobis_artikel.artikel_code)
");
?>
IEDEREEN BEDANKT VOOR DE HULP!
Gewijzigd op 12/01/2011 18:03:24 door Tobias Tobias