/ Forside/ Teknologi / Udvikling / SQL / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Hjælp til SQL sætning
Fra : hr_hvalsoe
Vist : 552 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

 
 
Kommentar
Fra : SuperDelphi


Dato : 05-01-08 00:33

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

Kommentar
Fra : hr_hvalsoe


Dato : 05-01-08 01:13

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

Kommentar
Fra : hr_hvalsoe


Dato : 05-01-08 11:36

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

Kommentar
Fra : hr_hvalsoe


Dato : 05-01-08 15:06

Hej Anders

Jeg tester det lige om nogle timer.

Det er korrekt, at trin to kun er et "hjælpetrin".

Hr_hvalsoe

Kommentar
Fra : hr_hvalsoe


Dato : 05-01-08 21:33

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

Kommentar
Fra : hr_hvalsoe


Dato : 05-01-08 21:53

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

Kommentar
Fra : hr_hvalsoe


Dato : 05-01-08 21:55

Glemte lige at skrive, at ovenstående fejler i Access:

Denne underforespørgsel returerer maksimalt en post.

Hr_hvalsoe

Kommentar
Fra : hr_hvalsoe


Dato : 05-01-08 22:25

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.
Søg
Reklame
Statistik
Spørgsmål : 177429
Tips : 31962
Nyheder : 719565
Indlæg : 6407948
Brugere : 218878

Månedens bedste
Årets bedste
Sidste års bedste