SELECT als SUM uit tabel1 groter is dan waarde uit tabel2

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tobias Tobias

Tobias Tobias

12/01/2011 14:23:53
Quote Anchor link
Hoi,

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
 
PHP hulp

PHP hulp

24/01/2020 05:37:33
 
Karl Karl

Karl Karl

12/01/2011 14:48:23
Quote Anchor link
Een join zou uitkomst moeten bieden.
 
John D

John D

12/01/2011 14:56:49
Quote Anchor link
Karl Karl op 12/01/2011 14:48:23:
Een join zou uitkomst moeten bieden.
Inderdaad een ordinaire join en dan aangevuld met having en je hoeft dan in php niks meer te processen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;

Er kan mega veel in SQL alleen de kennis ontbreekt te vaak en dan wordt het maar php opgelost ervaar ik dagelijks....
 
Tobias Tobias

Tobias Tobias

12/01/2011 15:42:37
Quote Anchor link
ik heb nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)
?>


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
 
Karl Karl

Karl Karl

12/01/2011 16:20:40
 
Tobias Tobias

Tobias Tobias

12/01/2011 17:09:23
Quote Anchor link
ik heb nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)

    "
);
?>

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
 
Bas Cost Budde

Bas Cost Budde

12/01/2011 17:27:48
Quote Anchor link
SELECT vobis_artikel.*, SUM(COALESCE(vobis_artikel_batch.aantal, 0)) AS voorraad

enz
 
Tobias Tobias

Tobias Tobias

12/01/2011 17:50:50
Quote Anchor link
Bas Cost Budde op 12/01/2011 17:27:48:
SELECT vobis_artikel.*, SUM(COALESCE(vobis_artikel_batch.aantal, 0)) AS voorraad

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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)    
    "
);
?>


IEDEREEN BEDANKT VOOR DE HULP!
Gewijzigd op 12/01/2011 18:03:24 door Tobias Tobias
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.