Avatar billede kimlarsen1978 Nybegynder
17. november 2006 - 21:48 Der 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?????????
Avatar billede kimlarsen1978 Nybegynder
18. november 2006 - 20:49 #1
Det er mySQL hvis det har noget at sige...
Avatar billede kjulius Novice
18. november 2006 - 23:23 #2
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

Bringer noget af dette dig videre?
Avatar billede kimlarsen1978 Nybegynder
19. november 2006 - 17:29 #3
Ikke ret meget, hvis jeg bruger

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

Får jeg "2" ud i antal selvom der er 28????
Avatar billede kimlarsen1978 Nybegynder
19. november 2006 - 17:30 #4
Altså på hvormange forskellige "sælgere" er annoncerne "WHERE dato BETWEEN annonce.annonceStart AND annonce.annonceSlut" fordelt på?
Avatar billede kjulius Novice
19. november 2006 - 23:49 #5
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?
Avatar billede kjulius Novice
20. november 2006 - 00:01 #6
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
Avatar billede kjulius Novice
20. november 2006 - 00:12 #7
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)
Avatar billede fennec Nybegynder
20. november 2006 - 08:33 #8
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.
Avatar billede kimlarsen1978 Nybegynder
20. november 2006 - 18:17 #9
kjulius: de er udfyldt begge 2.

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
Avatar billede kimlarsen1978 Nybegynder
20. november 2006 - 18:19 #10
Count(annonce.annonceId) as antal bruges i udskriften:

while not rs.eof
  Response.Write rs("saelgerNavn") & " ["&rs("antal")&"]"
  ... 
  rs.MoveNext
wend
Avatar billede kjulius Novice
20. november 2006 - 19:10 #11
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.
Avatar billede fennec Nybegynder
21. november 2006 - 09:05 #12
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()
Avatar billede kimlarsen1978 Nybegynder
26. november 2006 - 15:16 #13
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.
Avatar billede fennec Nybegynder
27. november 2006 - 08:19 #14
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
Avatar billede kimlarsen1978 Nybegynder
27. november 2006 - 19:45 #15
Jeg har prøvet både med og uden "group by" og bruger jeg rs.recordcount får jeg -1
Avatar billede fennec Nybegynder
28. november 2006 - 08:33 #16
Mit sidste bud er at smide ",1,1" på rs.open da du kører MySQL for at se om det hjælper:
rs.open strSQL, conn, 1, 1

Hvis du så ikke kan bruge rs.recordcount, kan jeg ikke hjælpe dig, uden at have direkte adgang til databasen.
Avatar billede kimlarsen1978 Nybegynder
28. november 2006 - 17:01 #17
1,1 er med desværre og jeg kan ikke give dig db adgang. Jeg bruger mit lille optæller-loop... Det virker også vender jeg tilbage til sagen senere...

Mange tak for de gode forslag
Avatar billede kjulius Novice
28. november 2006 - 20:32 #18
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"
Avatar billede kimlarsen1978 Nybegynder
28. november 2006 - 22:35 #19
kjulius: Det er næsten ved at være der.

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

Det er så bare den sidste jeg mangler nu...
Avatar billede kjulius Novice
28. november 2006 - 23:22 #20
Okay, så måske sådan her:

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"
Avatar billede kimlarsen1978 Nybegynder
29. november 2006 - 20:01 #21
Der var den! :-)

Lige et spg hvorfor har du "AS Tmp" med i

(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)

?
Avatar billede kjulius Novice
29. november 2006 - 21:25 #22
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.
Avatar billede kimlarsen1978 Nybegynder
30. november 2006 - 19:07 #23
Tak, svar bitte :-)
Avatar billede kjulius Novice
03. december 2006 - 19:24 #24
Sehr wohl, mein Herr! Hier kommt es... :-)
Avatar billede kimlarsen1978 Nybegynder
17. maj 2007 - 12:17 #25
Beklager at jeg har glemt at acceptere denne, men her kommer dine points :-)
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
Computerworld tilbyder specialiserede kurser i database-management

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