select in select?

Status
Niet open voor verdere reacties.

arjenwarners

Gebruiker
Lid geworden
7 jan 2008
Berichten
22
Goedemorgen,

Voor een database met verkoopgegevens wil ik eigenlijk een query maken waarin men kan zien welke artikelen zijn verkocht bij aankoop van een bepaald artikel.

Ik heb hiervoor twee tabellen.

De tabel posheader: Hierin staan de totaalgegevens van een verkoop.
De tabel positem: Hierin staan de artikelgegevens van een verkoop.

Dus stel iemand koopt 4 artikelen, dan komen er 4 regels in positem, die weer verwijzen naar de posheader.

Via een query kan ik de verkopen opvragen van het artikel waar het omgaat, ik krijg dan documentnummers van de kassabon. Nu moet ik alleen nog een query maken waarin ik vervolgens die documentnummers kan invoeren zodat ik de andere artikelen ook kan opvragen. Iemand enig idee hoe ik dit kan doen?
:thumb:
 
Je bedoelt dat je van 1 artikel de code hebt en je dan alle andere artikelen wil die bij die verkoop horen?

Dan kun je gewoon alle items zoeken met dezelfde artikelcode door de tabel op zichzelf te joinen.

Als je de velden uit p2 opvraagt krijg je informatie over alle artikelen op de bon.

[sql]
SELECT p2.artikel_naam
FROM posartikel as p1
INNER JOIN posartikel as p2
WHERE p1.artikel_id = 1 AND p1.header_id = p2.header_id
[/sql]
 
Hmz, ik snap hem nog niet helemaal denk ik. De query waarmee ik de gegevens krijg bij welk bonnummer artikel x is verkocht is als volgt:

Select distinct dbo.posheader.documentnumber,dbo.posheader.branch
FROM dbo.posItem INNER JOIN
dbo.posHeader ON dbo.posItem.HeaderRecUID = dbo.posHeader.RecUID
WHERE dbo.positem.productnumber = 'artikel x '

Ik krijg vervolgens een overzicht van documentnummer + filiaalnummer.

Aan de hand van deze gegevens wil ik dus eigenlijk alle artikelgegevens opvragen. Dus iets van:

SELECT dbo.posheader.documentnumber,dbo.posheader.branch,dbo.posartikelnummer
WHERE (en dan hier de uitkomst van de eerste query zeg maar)

Beter kan ik het eigenlijk niet uitleggen :)
 
Die dinstinct moet daar weg, anders krijg je maar 1 rij per documentnumber en je wil alle artikelen hebben.

Probeer dit eens. Het koppelt een extra kopie van de posItem aan het documentnumber zodat je alle rijen uit de tweede krijgt met artikelen.

[sql]Select dbo.posheader.documentnumber,dbo.posheader.branch, posRelatedItems.productnumber
FROM dbo.posItem INNER JOIN
dbo.posHeader ON dbo.posItem.HeaderRecUID = dbo.posHeader.RecUID
INNER JOIN dbo.posItem as posRelatedItems ON posRelatedItems.documentnumber = dbo.posheader.documentnumber
WHERE dbo.positem.productnumber = 'artikel x '
[/sql]

Je krijgt dan iets van

documentnumber branch productnumber
1 den haag artikel X
1 den haag artikel Y
1 den haag artikel Z
1 den haag artikel A
1 den haag artikel B
 
Ik begin de logica te begrijpen, maar krijg melding:

Msg 207, Level 16, State 1, Line 4
Invalid column name 'documentnumber'.

?
 
Hm dan koppel ik waarschijnlijk de verkeerde velden op die regel. Waarschijnlijk moet je RecUID en HeaderRecUID daar dan koppelen.
 
Volgens mij kom ik nu een stuk verder!!! Alvast bedankt, ik ga even stoeien met de output :D
 
Ik draai nu de volgende query:

SELECT dbo.posheader.documentnumber,dbo.posheader.branch, posRelatedItems.productnumber, dbo.posheader.subtotal
FROM dbo.posItem INNER JOIN
dbo.posHeader ON dbo.posItem.HeaderRecUID = dbo.posHeader.RecUID
INNER JOIN dbo.posItem AS posRelatedItems ON posRelatedItems.HeaderRecUID = dbo.posheader.RecUID
WHERE dbo.positem.productnumber = '12150003001001'
AND dbo.posheader.originaldocumenttype = '0'
AND dbo.posheader.subtotal > '0'
AND dbo.PosHeader.DocumentTime > '2010-10-25 07:00'
order by dbo.posheader.Branch,dbo.posheader.Reccreated

Echter zie ik nu dubbele regels. DWZ: Als in een verkoop bijvoorbeeld 2 stuks van artikel 12150003001001 worden verkocht en 1 stuks van artikel 8713243166014, dan krijg ik 6 regels te zien, ipv eigenlijk drie.

10882 221 12150003001001 40,95
10882 221 12150003001001 40,95
10882 221 8713243166014 40,95
10882 221 12150003001001 40,95
10882 221 12150003001001 40,95
10882 221 8713243166014 40,95
 
Dat komt omdat die query fout is.

De tweede join van de tabel posItem is een gevaarlijke.
Je krijgt namelijk een cross join(Kijk maar bij wikipedia onder cartesian product) bij meerdere artikelen van één soort per verkoop, en dat is in dit geval niet (en zelfs in het algemeen zelden) gewenst.

Wat je zoekt is het volgende.
een subquery die bepaalt welke orders het artikel bevatten, en van deze orders de gewenste informatie opvragen.
Dat heb ik hieronder geprobeerd. Ik heb gebruik gemaakt van korte Tabel aliassen om het nog wat leesbaarder te maken

[SQL]
SELECT H.documentnumber,
H.branch,
I.productnumber,
H.subtotal
FROM dbo.posHeader H
INNER JOIN dbo.posItem I on I.HeaderRecUID=H.RecUID
WHERE H.RecUID IN(
SELECT DISTINCT HeaderRecUID
FROM dbo.posItem
WHERE productnumber = 'artikel x '
)
AND H.originaldocumenttype = '0'
AND H.subtotal > '0'
AND H.DocumentTime > '2010-10-25 07:00'
ORDER BY H.Branch,
H.Reccreated
[/SQL]
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan