[SQL] Hoeveelheid berekenen

Pagina: 1
Acties:
  • 119 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 13-09 14:10
Ik wil berekenen hoeveel artikelen ik nodig heb.
Ik heb de volgende 2 tabellen.
Het is me gelukt een query te maken die van de Ochtend weergeeft welke producten er nodig zijn en hoeveel van elk.
Het probleem is echter dag ik dit ook van bijvoorbeeld de kollom nacht wil doen.
En aan het eind wil ik dan ook nog het totaal weten.
Dit is gewoon een kwestie van simpel optellen.
Dus mijn grootste probleem is hoe krijg ik het voor elkaar om om ook van de nacht weer te geven hoeveel er van elk artikel nodig is?

code:
1
2
3
4
5
6
7
8
Personen                  Producten
+-------+-----+------+   +---------+----------+
| naam  | dag | nacht|   | artikel |  naam    |
+-------+-----+------+   +---------+----------+
| naam1 |  1  |  1   |   |   1     | artikel1 |
| naam2 |  1  |  2   |   |   2     | artikel2 |
| naam3 |  2  |  1   |   +---------+----------+
+-------+-----+------+


SQL:
1
2
3
SELECT p1.Dag AS Artikel, COUNT( * ) AS "COUNT Dag"
FROM "Personen" AS p1
GROUP BY p1.Dag

Met deze query krijg ik dus alleen de eerste 2 kollommen van het gewenste resultaat.
Hoe moet ik vanaf hier verder.
Ik heb gekeken naar JOINS en UNIONS maar ik kwam er echt niet uit.
code:
1
2
3
4
5
6
+--------+----------+-------------+--------+
|Artikel |COUNT Dag | COUNT Nacht | Totaal |
+--------+----------+-------------+--------+
| 1      | 2        | ?           | ?      |
| 2      | 1        | ?           | ?      |
+--------+----------+-------------+--------+

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Aannemende dat die getallen in de kolommen dag en nacht je artikelnumemmers zijn en dat je met ochtend dag bedoelt dan zou je twee joins vanuit producten naar personen kunnen gebruiken.
Dus in je from 2x personen met verschillende aliassen (bijvoorbeeld: dag en nacht).

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • Acid__Burn
  • Registratie: Maart 2007
  • Laatst online: 22-08 11:53
Als ik me niet vergis kan je volstaan met:

code:
1
2
3
4
SELECT COUNT(DAG), COUNT(NACHT), (COUNT(DAG) + COUNT(NACHT))
FROM PERSONEN
GROUP BY COUNT(DAG), COUNT(NACHT)
ORDER BY NAAM ASC


Dan zou je zelfs nog een case o.i.d. kunnen gebruiken voor je artikelnamen. Daar kan je uiteraard ook een JOIN voor gebruiken.

[Edit]:
Code veranderd, waardoor je ook een totaal krijgt.

[ Voor 13% gewijzigd door Acid__Burn op 18-01-2008 15:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik vind dat voor een vraag dat gaat over optellen 'SUM' nog verdomde weinig genoemd is ;)

Acties:
  • 0 Henk 'm!

  • Acid__Burn
  • Registratie: Maart 2007
  • Laatst online: 22-08 11:53
Verwijderd schreef op vrijdag 18 januari 2008 @ 15:56:
Ik vind dat voor een vraag dat gaat over optellen 'SUM' nog verdomde weinig genoemd is ;)
Ik dacht juist dat hij het had over optellen van waardes, en geen getallen... Ok, ik weet dat dit vaag klinkt...

Hij wilde volgens mij (zo lees ik het) de waardes optellen, en in een overzicht hebben, en niet een SUM. Maar misschien heb je gelijk :D

Acties:
  • 0 Henk 'm!

  • akaro
  • Registratie: November 2007
  • Laatst online: 08-11-2024
zoiets?

select count(e.dag), count(f.nacht), p.artikel
from producten p
inner join persoon e on e.dag = p.artikel
inner join persoon f on f.nacht = p.artikel
group by p.artikel

[ Voor 3% gewijzigd door akaro op 18-01-2008 16:02 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Acid__Burn schreef op vrijdag 18 januari 2008 @ 15:58:
Hij wilde volgens mij (zo lees ik het) de waardes optellen, en in een overzicht hebben, en niet een SUM. Maar misschien heb je gelijk :D
Nee ik weet het ook niet, daarom hielt ik mijn opmerking ook maar redelijk oppervlakkig. De vraagstelling vind ik ook op zijn zachts gezegd: "vaag"

Acties:
  • 0 Henk 'm!

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 13-09 14:10
Nee ik wil geen juist geen som hebben.
In de tabel Personen staat per dag en nacht een artikel.
Dat is een nummer. In de tabel Producten kan ik aan de hand van dat nummer zien om welk artikel het gaat.
Ik kan deze nummers dus niet simpel weg optellen. Jou met jou code werkt het helaas niet Acid_Burn.
Ik denk dat ik inderdaad maar eens moet kijken door vanuit de tabel producten de artikelnummers te selecteren en hier door middel van joins aan te koppelen hoevaak deze voorkomen in de kolom Dag en Nacht van tabel Personen.

Stel:
Persoon 1 heeft Overdag Artikel 1 nodig, en in de Nacht Artikel 2
Persoon 2 heeft Overdag Artikel 1 nodig, en in de Nacht Artikel 1

Dan wil ik een overzicht maken als ->
Artikel 1 = 3 maal nodig
Artikel 2 = 1 maal nodig.

Hoeveel Artikelen er nodig zijn over de Dag en voor de Nacht is een tussenstap die niet direct nodig is.

[ Voor 24% gewijzigd door Gehakt op 18-01-2008 16:06 ]


Acties:
  • 0 Henk 'm!

  • akaro
  • Registratie: November 2007
  • Laatst online: 08-11-2024
volgens mij moet die van mij werken.
Het is een aantal op basis van de koppeling van persoon.nacht naar de product.artikel en als tweede koppeling van persoon.dag naar product.artikel. Een korte uitwerking van wat Justmental voorstelde (als ik die goed begreep)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Gehakt schreef op vrijdag 18 januari 2008 @ 15:39:
Ik heb gekeken naar JOINS en UNIONS maar ik kwam er echt niet uit.
UNION is echt niet zo moeilijk. Je weet al hoe het antwoord per daghelft moet doen, UNION ertussen en klaar ben je.

{signature}


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Iets met virtual tables of subqueries lijkt me hier een oplossing. Of ingewikkelde formules. Dus iets als:

SQL:
1
2
3
4
5
6
7
8
9
10
SELECT dagcounts.Artikel,  [COUNT Dag],  [COUNT Nacht], 
       [COUNT Dag]+[COUNT Nacht] As Totaal
FROM 
   (SELECT p1.Dag AS Artikel, COUNT( * ) AS [COUNT Dag]
     FROM Personen AS p1
     GROUP BY p1.Dag) as dagcounts, 
   (SELECT p1.nacht AS Artikel, COUNT( * ) AS [COUNT Nacht] 
     FROM Personen AS p1
     GROUP BY p1.nacht) as nachtcounts 
WHERE nachtcounts.Artikel=dagcounts.Artikel

Let op: deze gaat mis bij counts van 0. Je moet dan bijvoorbeeld iets met JOINS doen.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik had zelf zoiets in gedachten (mark platvoet ook weer blij ;) ):
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
select SUM(ochtend) as ochtend, SUM(avond) as avond, SUM(OCHTEND+AVOND) AS TOTAAL, artikel_id
FROM (
  select COUNT(ochtend) AS ochtend, 0 AS avond, artikel_id
  from artikel a
  join persoon p1 on p1.ochtend=a.artikel_id
  group by artikel_id
  UNION
  select 0 AS ochtend, COUNT(avond) AS avond, artikel_id
  from artikel a
  join persoon p1 on p1.avond=a.artikel_id
  group by artikel_id ) AS c1
GROUP BY c1.artikel_id

Kolomnamen komen uit mijn test database (iets anders helaas) en ik heb aan de kolom artikel nog een 3e test toegevoegd en in persoon iemand die artikel 1 in de ochtend en artikel 3 in de avond nodig heeft. Dit om verborgen inproducten iets beter te kunnen zien. Maar volgens mij klopt ie zo.

Overigens performt dit voor geen meter bij grotere databases, want unions zijn evil :) Garantie tot aan de deur zeg maar :D

edit:
Left outer join verwijdert uit eerdere probeersels, voegde niks toe.

[ Voor 5% gewijzigd door bigbeng op 18-01-2008 16:25 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Met subqueries vindt ik hem toch eigenlijk mooier, hoewel de snelheid misschien soms iets lager ligt dan met groups, outer joins e.d.:
SQL:
1
2
3
4
5
SELECT artikel,  
   (SELECT count(*) FROM Personen As p WHERE p.dag=artikel) AS [COUNT dag],
   (SELECT count(*) FROM Personen As p WHERE p.nacht=artikel) AS [COUNT Nacht], 
   [COUNT Dag]+[COUNT Nacht] As Totaal 
FROM producten

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 13-09 14:10
Ik was zelf al verder aan het prutsen met de joins maar dat wilde niet lukken in Base.
Het bovenstaande antwoord werkt wel perfect in MySQL. En de query is niet zo moeilijk te begrijpen als enkele anderen die ik hier voorbij heb zien komen :P Ik ga nu proberen of ik hetzelfde resultaat in Base kan krijgen maar ik moet eerst even opzoeken of die wel subqueries ondersteunt.

Acties:
  • 0 Henk 'm!

Verwijderd

akaro schreef op vrijdag 18 januari 2008 @ 16:02:
zoiets?

select count(e.dag), count(f.nacht), p.artikel
from producten p
inner join persoon e on e.dag = p.artikel
inner join persoon f on f.nacht = p.artikel
group by p.artikel
Heb je hier niet een probleem dat count-dag altijd gelijk is aan count-nacht?
Count telt het aantal rijen in de set en die verschilt niet van dag en nacht...

Acties:
  • 0 Henk 'm!

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 13-09 14:10
Klopt. Ik heb die query ook geprobeerd maar het antwoord in beiderijen was hetzelfde. En dat klopte niet.
Het enige probleem wat ik nu nog heb is dat dit niet mag in Base:
SQL:
1
2
3
4
--dit mag niet:
AS [Kolomnaam]
--dit mag wel:
AS "Kolomnaam"

Maar hoe ga ik dan 2 kolommen bij elkaar optellen? Want hetvolgende werkt ook niet:
SQL:
1
2
3
-- Hier gaat hij denk ik proberen 2 strings op te tellen.
-- Wat uiteraard niet kan.
"Kolomnaam2" + "Kolomnaam1" AS "Totaal"

Misschien ligt het aan mijn matige SQL kennis maar ik krijg het idee dat er nog veel verbeterd moet worden aan Base. Op dit moment heb ik het opgelost door de 3 subqueries bij elkaar op te tellen maar dat is natuurlijk verre van efficient of net.

[ Voor 79% gewijzigd door Gehakt op 18-01-2008 19:02 ]


Acties:
  • 0 Henk 'm!

  • KoW
  • Registratie: Juli 2001
  • Laatst online: 17-08-2022

KoW

Parse parsed te veel

Erm, dat is hem inderdaad niet.
Je moet dan echt de voorwaarde van kolom1 en kolom 2 bijeenvoegen met
voorwaardekolom1 OR voorwaardekolom2
Pagina: 1