Avatar billede jaffafo Nybegynder
18. april 2006 - 15:14 Der er 12 kommentarer og
2 løsninger

Hjælp til SQL sætning

Hej

Jeg skal hive data ud af 3 tabeller og lave en Count i én SQL sætning.

"SELECT Leikari.*, Limir.* FROM Leikari, Limir WHERE Leikari.Lid=1 And Limir.LimaNummar=Leikari.LimaNummar;"

Den sætning giver mig ialt 4 poster fra 2 tabeller som jeg skal bruge som ser ca sådan ud:

1 navn1 bla1
2 navn1 bla1
3 navn1 bla1
4 navn1 bla1

Så har jeg endnu en tabel hvor jeg vil tælle hvor mange gange den enkelte post (af de 4) optræder.

Mit slutresultat skulle gerne se sådan ud:

1 navn1 bla1 4
2 navn1 bla1 3
3 navn1 bla1 0
4 navn1 bla1 2

Hvor den sidste kolonne er det antal gange den posts ID forekommer i den 3. tabel.

Håber ikke det er forklaret dårligt, men det skulle være tilfældet så spørg endelig :)

mvh
Avatar billede fdata Forsker
18. april 2006 - 15:26 #1
Spøjse feltnavne ;o)

Kan du ikke lige sætte feltnavne på dine kolonner - evt beskrive de 3 tabeller.

"den sidste kolonne er det antal gange den posts ID forekommer i den 3. tabel".
Hvad er det for et felt, du kalder ID?

SKAL det ske i een eneste SQL sætning?
Avatar billede jaffafo Nybegynder
18. april 2006 - 15:36 #2
Tabellerne

Leikari:
LeikariNummar(Primærnøgle), LimaNummar, Lid

Limir:
LimaNummar(Primærnøgle), Lid

DystaLeikari:
DystaNummar (Primærnøgle), LeikariNummar, LeikplassNummar

Der er flere felter, men de er ikke interessante her ;).

Det jeg vil er at hive alle poster hvis LeikariNummer findes i tabellerne Leikari og Limir. Så få jeg et antal poster. Nu vil jeg så for hver enkelt post have at vide hvor mange gange LeikariNummar findes i den tredje tabel (DystaNummar) og få det tal TILFØJET til resulaterne fra den SQL jeg postede i starten.

For at hjælpe lidt på det så kan jeg sige at feltnavnene er færøske og database er en fodbolddatabase. Leikari = spiller, Dyst = kamp, Limir = medlemmer, LimaNummer = medlemsnummer, DystaNummar = kampnummer etcetc :)

Så jeg vil have information om de enkelte spillere vist i en Datalist. I den første SQL får jeg al den data jeg skal have undtagen antal kampe spillede.

bedre? :)
Avatar billede overchord Nybegynder
18. april 2006 - 15:58 #3
Du faar et problem med at bruge den i samme seatning som du allerede har fordi du ikke kan bruge SQL-optaellingsfunktionen COUNT sammen med aggregat udtrykket hvor du bruger asterisken for at vise begge tabellers indhold.
Istedet bliver du noed til at vaelge alle felterne indviduelt som du vil have med i foerspoergslen. Jeg proevede at lave 3 tabeller med de felter du naevner i din anden post, og fik :
SELECT Leikari.LeikariNummar, Leikari.LimaNummar, Leikari.Lid, Limir.LimaNummar, Limir.Lid, Count(DystaLeikari.LeikariNummar) AS CountOfLeikariNummar
FROM Limir INNER JOIN (Leikari INNER JOIN DystaLeikari ON Leikari.LeikariNummar = DystaLeikari.LeikariNummar) ON Limir.LimaNummar = Leikari.LimaNummar
GROUP BY Leikari.LeikariNummar, Leikari.LimaNummar, Leikari.Lid, Limir.LimaNummar, Limir.Lid;
Avatar billede fdata Forsker
18. april 2006 - 16:10 #4
Exactly  ;o)
Avatar billede jaffafo Nybegynder
18. april 2006 - 16:22 #5
Takker for svaret :)

Det virker... næsten 100% som jeg vil :P

Den tager KUN dem med der HAR sit ID i den 3. tabel (DystaLeikari). Jeg vil også have dem med der IKKE er med.. dvs den bare skal smide et 0 i feltet. Er det muligt?
Avatar billede overchord Nybegynder
18. april 2006 - 17:10 #6
Det bliver problematisk da foerspoergslen er baseret paa relationenerne mellem tabellerne. Mit bedste foreslag der vil vaere at indsaette en "dummy variable" i din Leikari og Limir tabeller hvor LimaNummar og LeikarNummar begge er 0. Dvs de "blanke" taelles ind under denne Dummy variable istedet.
Avatar billede overchord Nybegynder
18. april 2006 - 17:12 #7
Jeg smider lige et svar hvis du kan bruge det :-)

Mht Dummy variablen kan du blot navngive den som f.eks "andre spillere". Jeg gaar ud fra at det er dem som ikke er i spiller-listen du gerne vil have talt op ogsaa.
Avatar billede kjulius Novice
18. april 2006 - 18:28 #8
Skulle en LEFT JOIN mon ikke kunne klare den optælling (returnere Null når der ikke er rækker i tabellen DystaLeikari). Altså en lidt revideret overchord SQL:

SELECT Leikari.*, Limir.*, DL.CountOfLeikariNummar
FROM Limir INNER JOIN (Leikari LEFT JOIN [SELECT LeikariNummar, COUNT(*) AS CountOfLeikariNummar FROM DystaLeikari GROUP BY LeikariNummar]. AS DL ON Leikari.LeikariNummar = DL.LeikariNummar) ON Limir.LimaNummar = Leikari.LimaNummar
GROUP BY Leikari.LeikariNummar, Leikari.LimaNummar, Leikari.Lid, Limir.LimaNummar, Limir.Lid;

Hvis det ikke virker, vil jeg til mit forsvar sige, at jeg ikke har testet det... ;-)
Avatar billede kjulius Novice
18. april 2006 - 18:31 #9
SELECT Leikari.*, Limir.*, DL.CountOfLeikariNummar
FROM Limir INNER JOIN (Leikari LEFT JOIN [SELECT LeikariNummar, COUNT(*) AS CountOfLeikariNummar FROM DystaLeikari GROUP BY LeikariNummar]. AS DL ON Leikari.LeikariNummar = DL.LeikariNummar) ON Limir.LimaNummar = Leikari.LimaNummar

skulle det have været. Ingen grund til at bruge GROUP BY i den yderste SQL.
Avatar billede jaffafo Nybegynder
18. april 2006 - 18:42 #10
Kjulius:

"The MS Jet Database engine cannot find the input table or query 'SELECT LeikariNummar, COUNT(*) AS CountOfLeikariNummar FROM DystaLeikari GROUP BY LeikariNummar'. Make sure it exists and that its name is spelled correctly."

:(
Avatar billede kjulius Novice
18. april 2006 - 21:40 #11
Denne her virker på min version af Access:

SELECT Leikari.*, Limir.*, DL.CountOfLeikariNummar
FROM Limir INNER JOIN (Leikari LEFT JOIN [SELECT LeikariNummar, COUNT(*) AS CountOfLeikariNummar FROM DystaLeikari GROUP BY LeikariNummar]. AS DL ON Leikari.LeikariNummar=DL.LeikariNummar) ON Limir.LimaNummar=Leikari.LimaNummar;

Når jeg siger, at den virker, så mener jeg, at den ikke giver fejlmeldinger. Om den returner de rigtige data, ved jeg ikke. Jeg har ikke fyldt data i mine tabeller...
Men det kan du sikkert hurtigt finde ud af...
Avatar billede jaffafo Nybegynder
18. april 2006 - 23:14 #12
kjulius:

det virker fint, med nogle små justeringer.. :)  Det ville være perfekt hvis der kunne blive smidt nogle "0" i de tomme felter istedetfor null ;)

men smider du lige et svar så deler i points :)
Avatar billede kjulius Novice
19. april 2006 - 08:52 #13
Det burde en IIf funktion kunne klare:

SELECT Leikari.*, Limir.*, IIf(DL.CountOfLeikariNummar IS NULL, 0, DL.CountOfLeikariNummar)
FROM Limir INNER JOIN (Leikari LEFT JOIN [SELECT LeikariNummar, COUNT(*) AS CountOfLeikariNummar FROM DystaLeikari GROUP BY LeikariNummar]. AS DL ON Leikari.LeikariNummar=DL.LeikariNummar) ON Limir.LimaNummar=Leikari.LimaNummar;
Avatar billede kjulius Novice
19. april 2006 - 09:03 #14
Det burde en IIf funktion kunne råde bod på:

SELECT Leikari.*, Limir.*, IIf(DL.CountOfLeikariNummar Is Null,0,DL.CountOfLeikariNummar) AS LeikariAntal
FROM Limir INNER JOIN (Leikari LEFT JOIN [SELECT LeikariNummar, COUNT(*) AS CountOfLeikariNummar FROM DystaLeikari GROUP BY LeikariNummar]. AS DL ON Leikari.LeikariNummar=DL.LeikariNummar) ON Limir.LimaNummar=Leikari.LimaNummar;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester