17. november 2006 - 21:48Der er
24 kommentarer og 1 løsning
Count problem
Hejsa Jeg har denne SQL
SELECT Count(*) as antal FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"' group by saelger.saelgerId, saelger.saelgerNavn order by saelger.saelgerNavn ASC
problemet er at jeg ikke får dette rette count, den giver "2" i antal selvom der lige PT er 28?????????
Er den viste forespørgsel korrekt? Normalt ville man medtage de felter man grupperer på, så den skulle hedde:
SELECT saelger.saelgerId, saelger.saelgerNavn, COUNT(*) as antal FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId WHERE dato BETWEEN annonce.annonceStart AND annonce.annonceSlut GROUP BY saelger.saelgerId, saelger.saelgerNavn ORDER BY saelger.saelgerNavn
Giver det samme resultat?
Hvis du ønsker det samlede resultat (altså det rene antal annoncer), burde du fjerne GROUP BY:
SELECT COUNT(*) as antal FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId WHERE dato BETWEEN annonce.annonceStart AND annonce.annonceSlut
SELECT COUNT(*) as antal FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId WHERE dato BETWEEN annonce.annonceStart AND annonce.annonceSlut
får jeg antallet af annoncer (som du også skriver), men det er antallet af forskellige sælgere jeg er interesseret i. Hvis jeg bruger
SELECT saelger.saelgerId, saelger.saelgerNavn, COUNT(*) as antal FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId WHERE dato BETWEEN annonce.annonceStart AND annonce.annonceSlut GROUP BY saelger.saelgerId, saelger.saelgerNavn ORDER BY saelger.saelgerNavn
Okay, hvis det er antallet af sælgere, der har solgt nogen annoncer i perioden, du er interesseret i, så er det nok snarere sådan noget som det her du har brug for:
SELECT COUNT(DISTINCT annonceSaelgerId) FROM markedAnnonce WHERE dato BETWEEN annonceStart AND annonceSlut
Den anden forespørgsel skal vise de sælgere, der har solgt noget i perioden, og hvor mange annoncer de hver isæt har solgt. Gør den ikke det?
En anden mulighed er, hvis du også ønsker de sælgere medtaget på listen, som ikke har solgt noget i perioden. I så fald skal du bruge en OUTER JOIN i stedet for en INNER JOIN:
SELECT saelger.saelgerId, saelger.saelgerNavn, COUNT(*) as antal FROM markedSaelger AS saelger LEFT OUTER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId WHERE annonce.annonceSaelgerId IS NULL OR dato BETWEEN annonce.annonceStart AND annonce.annonceSlut GROUP BY saelger.saelgerId, saelger.saelgerNavn ORDER BY saelger.saelgerNavn
Du bliver ved med at skrive, at der er 28. Jeg er kommet til at tænke på, at kun rækker, hvor både annonceStart og annonceSlut er udfyldt med en dato, vil blive talt med, da kun sådan vil de opfylde kriteriet, som angivet i spørgsmålet. Du har ikke nogen annoncer, hvor startDatoen eller slutDatoen står åben (altså er NULL), vel? For så er du nødt til at teste for den mulighed også:
WHERE (annonceStart IS NULL or dato >= annonceStart) AND (annonceSlut IS NULL or dato <= annonceSlut)
Hvad sker der hvis du fjerner count og bare har "select * from...". Prøv at lave et loop som udskriver de resultater. Jeg er overbevist om at du så kun får 2 resultater.
fennec: Der kommer 28 ud for lige nu er jeg nødt til at tælle dem op inden jeg bruger rs'et, sådan her:
**************** strSQL = "SELECT Count(annonce.annonceId) as antal, saelger.saelgerNavn, saelger.saelgerId FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"' group by saelger.saelgerId, saelger.saelgerNavn order by saelger.saelgerNavn ASC"
set rs = Conn.Execute(strSQL) if not rs.eof then 'Optælling af poster, har haft problemer med at få count(*) til at virke, så jeg kan ikke få en total count fra DB'en count = 0 while not rs.eof count = count + 1 rs.MoveNext wend
rs.MoveFirst if count mod 2 = 0 then half = (count/2)-1 else half = int(count/2) end if
Måske er det mig, der er en svagspasser med hjerneskrump, men jeg kan altså ikke helt finde ud af, hvor du får de 28 fra (hvad? countværdi? rækker? rækker fra en forespørgsel? rækker fra en tabel?).
Returnerer en SQL som
strSQL = "SELECT saelger.saelgerNavn, saelger.saelgerId FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"'
28 rækker?
Din sætning "Der kommer 28 ud for lige nu er jeg nødt til at tælle dem op inden jeg bruger rs'et, sådan her:" får mig til at tænke, at du tæller de 28 direkte fra markedAnnonce tabellen. Hvis det er rigtigt, og forespørgslen ikke returnerer det samme antal rækker, må der være noget galt med nogen af dine referencer til markedSaelger.
kjulius >> Det er ikke kun dig. Jeg er heller ikke helt med :o)
kimlarsen1978 >> for at få bare lidt afklaring, hvor mange rækker er er så i markedSaelger og markedAnnonce?? Ikke noget join, bare det direkte antal i hver. Hvor mange markedAnnonce er der så inden for datoen?? Altså disse 3 sql:
select count(*) from markedSaelger select count(*) from markedAnnonce select count(*) from markedAnnonce where annonceStart <= date() AND annonceSlut >= date()
SQL'en: strSQL = "SELECT saelger.saelgerNavn, saelger.saelgerId FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"'
Giver 28 rækker.
Tilføjer jeg så "Count(annonce.annonceId) as antal" til ovenstående SQL får jeg i "antal" det antal annoncer, hver af de 28 sælgere har, fx 56 eller 3. Dette er OK!
Tilføjer jeg i stedet for "Count(*) as antal" får jeg 2 ud i antal. Det fatter jeg ikke en bjelle af, jeg vil jo gerne have 28 ud, da det er antallet af sælgere der har annoncer indenfor perioden.
Når du siger "tilføjer Count(annonce.annonceId) as antal til ovenstående SQL". Mener du så at den bliver til: strSQL = "SELECT Count(annonce.annonceId) as antal, saelger.saelgerNavn, saelger.saelgerId FROM..."
For det dur ikke. Der skal så være en "group by", som jeg går ud fra du har med, men den tæller ikke længere det totale antal rækker. Der skal det laves for sig selv uden nogen group by: strSQL = "SELECT Count(annonce.annonceId) as antal FROM..."
Ellers kan du jo også gå over og bruge et recordset: Set rs = Server.CreateObject("ADODB.Recordset") rs.open strSQL, conn
så kan du trække antal rækker ud med: antal = rs.recordcount
Altså, hvis der ikke er for mange rækker, og du alligevel skal have dem alle udskrevet, er der jo den mulighed at starte med at "hive dem indebords" ved at bruge rs.movelast, hvorefter rs.RecordCount vil vise det rigtige antal. Altså noget lignende dette:
rs.MoveLast 'Flyt cursoren til sidste række. Dette vil også indlæse alle rækker til bufferen antal = rs.RecordCount rs.MoveFirst Do While not rs.EOF ... gør noget Loop
Alternativt (og nu er det endeligt begyndt at dæmre, hvad du ønskede af din forespørgsel), nemlig det totale antal rækker dupliceret til de grupperede rækker:
strSQL = "SELECT Count(annonce.annonceId) as antal, saelger.saelgerNavn, saelger.saelgerId, (SELECT COUNT(*) FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"') AS TotalAntal FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"' group by saelger.saelgerId, saelger.saelgerNavn order by saelger.saelgerNavn ASC"
Den SQL du har skrevet giver min det totale antal annoncer i "TotalAntal", det er ikke helt det jeg gerne vil have, men jeg kan godt finde anvendelse for det - så tak for det.
Men
Kan der tilføjes noget så jeg også får det totale antal sælgere (det jeg er ude efter)? Så jeg får
antal = Det antal annoncer der er aktive pr. sælger OK TotalAntal = Det totale antal aktive annoncer for alle sælgere til sammen OK TotalAntalSaelgere = Det totale antal aktive sælgere MANGLER
strSQL = "SELECT Count(annonce.annonceId) as antal, saelger.saelgerNavn, saelger.saelgerId, (SELECT COUNT(*) FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"') AS TotalAntal, (SELECT COUNT(*) FROM (SELECT DISTINCT saelger.saelgerId FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"') AS Tmp) AS AntalSaelgere FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"' group by saelger.saelgerId, saelger.saelgerNavn order by saelger.saelgerNavn ASC"
(SELECT COUNT(*) FROM (SELECT DISTINCT saelger.saelgerId FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"') AS Tmp)
Det er fordi COUNT(*) tæller antal rækker i den midlertidige "tabel" der bliver oprettet inden i parantesen. En sådan midlertidig tabel skal navngives - i dette tilfælde navngiver jeg den til Tmp.
Men jeg har godt nok overvejet om det ikke i stedet kunne omskrives til:
(SELECT COUNT(DISTINCT saelger.saelgerId) FROM markedSaelger AS saelger INNER JOIN markedAnnonce AS annonce ON saelger.saelgerId = annonce.annonceSaelgerId where annonce.annonceStart <= '"& dato &"' AND annonce.annonceSlut >= '"& dato &"')
Altså, at man i stedet for at oprette en midlertidig tabel med DISTINCT, hvis rækker man tæller, simpelthen tæller antallet af unikke værdier af feltet sealgerId. Det burde give samme resultat... - og måske er det nemmere at gennemskue.
Beklager at jeg har glemt at acceptere denne, men her kommer dine points :-)
Synes godt om
Ny brugerNybegynder
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.