|
| Hjælp til SQL sætning Fra : hr_hvalsoe | Vist : 539 gange 200 point Dato : 04-01-08 23:58 |
|
Jeg skriver ang. En SELECT sætning, som jeg ikke kan greje hvordan, skal se ud.
Sætningen er egentlig møntet på at blive anvendt i en SQL server database, men for overskuelighedens skyld, har jeg dannet problemstillingen i Access også (databasen kan downloades – jf. link i bunden).
Følgende tabeller eksisterer:
Varetabel (indeholder en liste over alle varer)
ID (primær nøgle, anvendes ikke)
Varenr (varenummer - type: Number)
Aktiv (1 = aktiv vare, 0 = ikke aktiv vare - type: Number)
VarePrBilagTabel(indeholder tilvalgte varer på et bilag)
ID (primær nøgle, anvendes ikke)
Varenr (varenummer - type: Number)
Bilagsnr (Et bilagsnummer optræder flere gange med forskellige varenumre - type: Number)
Nedenstående regler skal gælde – illustreres i trin herunder:
1. Vise alle aktive varer fra Varetabel. Dette udføres naturligvis simpelt ved denne SELECT sætning:
SELECT Varetabel.varenr, Varetabel.aktiv
FROM Varetabel
WHERE Varetabel.aktiv=1
2. Vise inaktive varer (dvs. varer hvor aktiv er sat til 0), men hvor varen er listet i tabellen VarePrBilagTabel. Dette klares også let med en lille udbygning af SELECT sætning. Dog bliver det ikke til den endelige og dermed heller ikke den korrekte SELECT sætning:
SELECT Varetabel.varenr, Varetabel.aktiv
FROM Varetabel LEFT JOIN VarerPrBilagTabel ON Varetabel.varenr = VarerPrBilagTabel.varenr
WHERE Varetabel.aktiv=1 OR (Varetabel.varenr=VarerPrBilagTabel.varenr)
3. Vise ovenstående for et specifikt bilagsnr. fra VarerPrBilagTabel (efter dette er SELECT sætningen færdig og korrekt).
Her opstår problemet. Jeg kan ikke greje hvorledes jeg får puttet ind, at der kun skal kigges på varenumre i VarerPrBilagTabel hvor bilagsnr = f.eks. 10. Denne tabel indeholder jo ”mange” bilagsnumre, hvor de samme varenumre kan være listet flere gange for forskellige bilag.
For nemhedens skyld har jeg lagt denne forsimplede database op på følgende URL:
www.guldholdet.com/Varedatabase.mdb
Forespørgslen er også dannet i databasen (VarerFinal)
Spørg løs, hvis I har spørgsmål. Jeg tjekker min e-mail ofte, og skal nok svare hurtigt. Går dog i seng indenfor nogle timer i dag :)
På forhånd tak
Mvh
Hr_hvalsoe
| |
|
Hej
Er selv på vej i seng, men for mig at se skal du under Select nr 2.
bruge:
WHERE Varetabel.aktiv=0 AND Varetabel.varenr=VarerPrBilagTabel.varenr
3 skulle så gerne være
WHERE Varetabel.aktiv=0 AND Varetabel.varenr=VarerPrBilagTabel.varenr AND VarerPrBilagTabel.varenr=10
Og på 3 kan 10 så erstattes af en parameter istedet.
Ring evt i morgen på 86652486
mvh
Poul-Erik
| |
|
Hej Poul-Erik
Tak for hurtig respons.
Jeg tror ikke jeg har formuleret mig klart nok.
Trin 2 er en forlængelse af trin 1 forstået således, at begge "regler" skal gælde.
Med andre ord skal der som udgangspunkt vises alle aktive varer (aktiv = 1) fra Varetabel. Yderligere skal inaktive varer også medtages såfremt varenummeret for en inaktiv vare er listet i VarerPrBilagTabel for det aktuelle bilag (dvs. her kommer trin 2-3 ind i billedet).
Alt skal dermed være opfyldt.
Lad os antage at der findes tre varenr i Varetabel:
4550 (aktiv)
4551 (inaktiv)
4552 (inaktiv)
I VarerPrBilagTabel eksisterer følgende varer
Bilagsnr. 10, Varenr 4550
Bilagsnr. 10, Varenr 4551
Bilagsnr. 11, Varenr 4552
Hermed skal resultatet være, at varenr. 4550 og 4551 vises for bilagsnr. 10.
Mvh
Hr_hvalsoe
| |
| Kommentar Fra : ajuul |
Dato : 05-01-08 10:54 |
|
Du kan jo bruge det faktum, at bilagene kun skal vises, hvis summen af aktiv er større end 1:
Kode SELECT VarerPrBilagTabel.bilagsnr, VarerPrBilagTabel.varenr
FROM VarerPrBilagTabel INNER JOIN Varetabel ON VarerPrBilagTabel.id = Varetabel.id
GROUP BY VarerPrBilagTabel.bilagsnr, VarerPrBilagTabel.varenr
HAVING (Sum(Varetabel.aktiv)>0); |
Det skulle jo være det, ikke sandt?
Anders
| |
|
Hej Anders
Jeg vil undersgøe dit forslag senere i dag, når jeg har tid.
Tak for dit indlæg.
Hr_hvalsoe
| |
| Kommentar Fra : ajuul |
Dato : 05-01-08 11:45 |
|
Hej igen, Hr_hvalsoe.
Der er noget galt med dét jeg skrev. Vent lidt med at se på det.
Anders
| |
| Kommentar Fra : ajuul |
Dato : 05-01-08 12:08 |
|
Jeg kom til at joine på id, og det var jo mildest talt en bøf:
Det skulle være sådan her:
Kode SELECT VarerPrBilagTabel.bilagsnr, Varetabel.varenr
FROM VarerPrBilagTabel INNER JOIN Varetabel ON VarerPrBilagTabel.varenr = Varetabel.varenr
WHERE (((select sum(aktiv) from varetabel))>0)
GROUP BY VarerPrBilagTabel.bilagsnr, Varetabel.varenr
HAVING (VarerPrBilagTabel.bilagsnr=10); |
Dog duer den ikke, hvis der ikke står et HAVING ... til sidst, da den ikke kan gruppere over varetabel.
Kan dette bruges? Ellers er jeg bange for, at du må lave to SQL-sætninger (altså en midlertidig tabel som du forespørger videre på).
Kort sagt er dette løsningen på pkt. 3 - men som jeg forstår det skal du ikke bruge 2 til noget, vel?
mvh. Anders
| |
|
Hej Anders
Jeg tester det lige om nogle timer.
Det er korrekt, at trin to kun er et "hjælpetrin".
Hr_hvalsoe
| |
|
Hej Anders
Forespørgslen gør desværre ikke helt det rigtige.
Den medtager kun varer hvor bilagsnr. = 10.
Dette går ikke. Hvis en vare er aktiv, skal den også medtages..
Mvh
Hr_hvalsoe
| |
| Kommentar Fra : ajuul |
Dato : 05-01-08 21:48 |
|
I den sidste linie skal HAVING VarerPrBilagTabel.bilagsnr=10 eventuelt erstattes af et andet bilagsnummer. Er det ikke dét du ønsker?
Eller ønsker du i virkeligheden bare alle solgte varer for alle bilagsnumre?
- ANders
| |
|
Hej Anders
Det jeg ønsker er blot en liste over alle varenr. fra Varetabel hvor varerne er sat til aktive.
Yderligere skal dog medtages varer, som fremgår i VarerPrBilagTabel for det aktuelle bilag man søger på/arbejder med.
Jf. dette eks.:
Lad os antage at der findes tre varenr i Varetabel:
4550 (aktiv)
4551 (inaktiv)
4552 (inaktiv)
I VarerPrBilagTabel eksisterer følgende varer
4550, Bilagsnr. 10
4551, Bilagsnr. 10
4552, Bilagsnr. 11
Hermed skal resultatet være, at varenr. 4550 og 4551 vises for bilagsnr. 10.
Jeg tror dog man skal ind på noget lignende dette:
SELECT Varetabel.varenr, Varetabel.aktiv, VarerPrBilagTabel.bilagsnr
FROM Varetabel LEFT JOIN VarerPrBilagTabel ON Varetabel.varenr = VarerPrBilagTabel.varenr
WHERE Varetabel.aktiv=1 OR (varetabel.varenr = (SELECT VarerPrBilagTabel.varenr FROM VarerPrBilagTabel WHERE VarerPrBilagTabel.bilagsnr=10));
Det "nye" i denne sætning er, at jeg medtager en underforspørgsel, som jeg sammenligner med Varetabel.Varenr:
varetabel.varenr = ( SELECT VarerPrBilagTabel.varenr FROM VarerPrBilagTabel WHERE VarerPrBilagTabel.bilagsnr=10)
Tak for din tid indtil videre :)
Mvh
Hr_hvalsoe
| |
|
Glemte lige at skrive, at ovenstående fejler i Access:
Denne underforespørgsel returerer maksimalt en post.
Hr_hvalsoe
| |
|
Hej alle
Jeg fandt denne simple løsning på problemet:
SELECT Varetabel.varenr, Varetabel.aktiv
FROM Varetabel
WHERE Varetabel.aktiv=1 OR Varetabel.varenr IN (SELECT VarerPrBilagTabel.varenr FROM VarerPrBilagTabel WHERE VarerPrBilagTabel.bilagsnr=10);
Tak for Jeres indsats.
Mvh
Hr_hvalsoe
| |
| Kommentar Fra : rpje |
Dato : 08-01-08 08:37 |
|
Denne er måske mere effektiv ved støre data mængder:
SELECT Varetabel.varenr, Varetabel.aktiv
FROM Varetabel LEFT JOIN VarerPrBilagTabel ON Varetabel.varenr = VarerPrBilagTabel.varenr
WHERE Varetabel.aktiv=1 OR VarerPrBilagTabel.bilagsnr=10
group by Varetabel.varenr, Varetabel.aktiv
MV
Peter
| |
| Du har følgende muligheder | |
|
Dette spørgsmål er blevet annulleret, det er derfor ikke muligt for at tilføje flere kommentarer.
| |
|
|