Avatar billede midgaardsorm Nybegynder
27. juni 2008 - 12:48 Der er 6 kommentarer og
1 løsning

Select Count *2 med hver sin WHERE i samme SQL

Hej

Den her driller mig :
Jeg har en tabel : Nr , dato

Jeg ønsker at lave en forespørgelse der lister antallet af nr. pr måned i løbet af et år.

Resultat :
AntalNr Måned
274      JAN
255      FEB
265      MAR

Jeg henter data fra NAV5 via sammenkædet tabeller i Acces2003
Avatar billede jensen363 Forsker
27. juni 2008 - 12:52 #1
SELECT Count(DinTabel.Nr) AS CountOfNr, Month([Dato]) AS Expr1
FROM DinTabel
GROUP BY Month([Dato]);
Avatar billede kjulius Novice
28. juni 2008 - 00:54 #2
Uden at vide det, tror jeg det du ønsker er en COUNT(DISTINCT Nr) funktion. Altså en funktion, som tæller antallet at unikke numre (hvis der er 10 rækker med nr. 1 tæller det kun 1 gang). Desværre er det ikke en funktion, som Access understøtter, så du bliver nødt til at gå en omvej, f.eks.:

SELECT COUNT(*) AS AntalNr, Måned
FROM [SELECT DISTINCT Antal, Month(Dato) AS Måned FROM dinTabel]. AS Tmp
GROUP BY Måned

Du kunne også have gjort det som man normalt ville gøre sådan noget i Access:

1) Opret en forespørgsel med distinct, f.eks.:

DistData:
SELECT DISTINCT Antal, Month(Dato) AS Måned
FROM dinTabel

2) Herefter ku' du oprette en ny forespørgsel, som i stedet for direkte at basere sig på din tabel i stedet baserer sig på forespørgslen:

DistCount:
SELECT COUNT(*) AS AntalNr, Måned
FROM DistData
GROUP BY Måned

Som du kan se, er det reelt det samme som den første forespørgsel, bare delt op i to på hinanden baserende forespørgsler.
Det er normalt den måde man gør det på i Access, da den har meget dårlig understøttelse af den anden måde at gøre det på. Og med mindre det er en dynamisk opbygget forespørgsel (som det ofte er ved f.eks. web-forespørgsler), gør det heller ikke noget. Ved dynamisk opbyggede forespørgsler når man desværre hurtigt "muren" med Access. Her skal der noget stærkere værktøj (en bedre database) til.
Avatar billede midgaardsorm Nybegynder
02. juli 2008 - 14:44 #3
Hmm....jeg prøver med en anden forklaring for I skyder begge ved siden af.

Select (Select Count(nr) where dato between 01-01-08 and 31-01-08) As jan, (Select Count(nr) where dato between 01-02-08 and 29-02-08) As feb, (Select Count(nr) where dato between 01-03-08 and 31-03-08) As mar ..... frem til og med Dec.

Det her ser jo godt ud men det virker ikke i Access2003.
Avatar billede petersen7913 Forsker
03. juli 2008 - 16:12 #4
Måske er det UNION du mangler?

Select .... januar
UNION
Select .... februar
UNION
......
Avatar billede kjulius Novice
04. juli 2008 - 17:27 #5
Din SQL burde nu nok virke i Access (bortset fra, at datoformatet skal afgrænses af #.

Jeg ville nok gøre det sådan i stedet:

SELECT SUM(IIF(MONTH(dato)=1,1,0)) AS jan, SUM(IIF(MONTH(dato)=2,1,0)) AS feb, SUM(IIF(MONTH(dato)=3,1,0)) AS mar, SUM(IIF(MONTH(dato)=4,1,0)) AS apr, SUM(IIF(MONTH(dato)=5,1,0)) AS maj, SUM(IIF(MONTH(dato)=6,1,0)) AS jun
FROM dinTabel
WHERE YEAR(dato)=2008

Den tæller alle rækker (altså det samme som COUNT(*)). Hvis der er en grund til, at du har brugt COUNT(nr), f.eks. hvis nogle af rækkerne har et nr sat til NULL, kan det være nødvendigt også at teste for NULL i IIF sætningen:

IIF(nr IS NOT NULL AND MONTH(dato)=2,1,0)

Grunden til at du har brugt COUNT(nr) er dog sandsynligvis bare, at du har hørt, at det skal man gøre (hvilket jeg aldrig rigtigt har forstået, men det er sikkert min fejl :-))
Avatar billede midgaardsorm Nybegynder
07. august 2008 - 09:23 #6
Lavede 12 forespørgelser i stedet for....

Ikke kønt men effektivt

Tak for foreslagene.
Avatar billede kjulius Novice
07. august 2008 - 20:30 #7
Nej, hverken kønt eller nødvendigt. Men du sidder jo ved styrepinden... :-)
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