webForumDet fria alternativet

Max antal av samma månad och år

Databaser & SQL

19 svar · 347 visningar · startad av i-or

Medlem sedan nov. 2001294 inlägg
Frågan#1

Jag har en kolumn i en databas med datum. Jag skulle vilja få reda på maxantalet som finns av en viss månad och år.

Alltså:
2002-08-21
2002-06-23
2002-06-21
2002-08-10
2002-08-12

Dessa datum ska generera talet 3. Vilken månad och år som gäller är ointressant.

Medlem sedan juni 200032 967 inlägg
#2

Vad använder du för dbms? Access?

Medlem sedan nov. 2001294 inlägg
#3

Access...

Medlem sedan juni 200032 967 inlägg
#4

För Access borde detta fungera:

SELECT COUNT(*) AS Antal FROM (SELECT DISTINCT Year(datumkolumnen), Month(Datumkolumnen) FROM tabellen)

Mvh,

Medlem sedan dec. 200012 464 inlägg
#5

select count(*),year(datum),month(datum) from t
group by 2,3 having count(*) = (select max(c)
from (select count(*) c,  year(datum),month(datum) from t
group by 2,3) )
Medlem sedan dec. 200012 464 inlägg
#6

Någon har missförstått. Vad menar du med max-antalet? Jag tolkade det som att du vill visa år och månad där det finns flest poster eller vill du bara veta hur många poster det finns för given månad och år?

Medlem sedan nov. 2001294 inlägg
#7

Jag vill bara veta antalet poster.

Medlem sedan dec. 200012 464 inlägg
#8
select count(*) as antal from t where month(datum) = 8 and year(datum) = 2002
Medlem sedan nov. 2001294 inlägg
#9

Jag vet inte vilken månad som har flest poster.

Alltså jag vill ha max antalet poster för en viss månad (som inte är given).

Medlem sedan nov. 2001294 inlägg
#10

@nders SQL:

SELECT COUNT(*) AS Antal FROM (SELECT DISTINCT Year(Dat), Month(Dat) FROM Diary)

ger antalet unika månader. Någonstans måste väl max(?) komma in. Men jag vet inte var?

Medlem sedan nov. 2001294 inlägg
#11

Jag provade att fixa lite i Larsg:s SQL-sats:

select count(*),year(datum),month(datum) from t
group by 2,3 having count(*) = (select max(c)
from (select count(*) c, year(datum),month(datum) from t
group by 2,3) )

men jag fick detta felmeddelande:

"Microsoft JET Database Engine fel '80004005'
Du har skrivit en underfråga som kan returnera flera fält utan att använda det reserverade ordet EXISTS i huvudfrågans FROM-instruktion. Ändra underfrågans SELECT-uttryck så att endast ett fält efterfrågas."

c:et i "count(*) c" var jag tvungen att ta bort. Fick felmeddelande. Vad har c:et för funktion egentligen? Sedan stod det att Year(Dat) inte ingick i uttrycket och då la jag in det på ett till ställe tillsammans med group by. Den slutliga SQL-satsen som genererade felmeddelandet ovan ser ut som följande:

select count(*), year(dat), month(dat) from diary group by 2, 3 having count(*) = (select max(c), year(dat), month(dat) from (select count(*), year(dat), month(dat) from diary group by 2, 3) group by 2, 3)

Vad är felet?

Medlem sedan juni 200032 967 inlägg
#12

i-or skrev:

@nders SQL:

SELECT COUNT(*) AS Antal FROM (SELECT DISTINCT Year(Dat), Month(Dat) FROM Diary)

ger antalet unika månader. Någonstans måste väl max(?) komma in. Men jag vet inte var?

Jag förstod det som att det var det du ville ha.

Medlem sedan nov. 2001294 inlägg
#13

Vad surt att man inte kan formulera sitt problem så att folk förstår! :(

Om jag försöker förklara mitt problem från början kanske det går bättre.

Jag ska göra ett stapeldiagram med utgångspunkt för hur många träningspass varje löpare gör varje månad. Längden på staplarna ska maximalt vara antalet träningspass löparen gör den månad då han tränar mest. Med utgångspunkt från detta maxvärde bestäms sedan längden på de övriga staplarna.

Alltså vill jag få fram antalet träningspass den månad, som löparen har tränat flest träningspass.

(Varje träningspass är en post i databasen.)

Jag hoppas att du förstår problemet nu.

Medlem sedan juni 200032 967 inlägg
#14

Ok!

Jag har skrivit en SQL-fråga full av gissningar eftersom jag inte använder eller kan Access.

SELECT TOP 1 COUNT(*) AS Antal, Year(Dat), Month(Dat) AS Antal FROM (SELECT DISTINCT Year(Dat), Month(Dat) FROM Diary) GROUP BY 2, 3 ORDER BY 1 DESC

Du får testa den själv, så håller jag tummarna... ;)

Mvh,

Medlem sedan nov. 2001294 inlägg
#15

Tyvärr:

"Microsoft JET Database Engine fel '80040e10'
Det har inte angetts något värde för en eller flera nödvändiga parametrar. "

Jag får väl invänta LarsG och hoppas att han har någon lösning.

Tack ändå!

Medlem sedan juni 200032 967 inlägg
#16

Mja, det där kan nog inte fungera förresten. Men det här kanske:

SELECT TOP 1 COUNT(*) AS Antal, theYear, theMonth AS Antal FROM (SELECT DISTINCT Year(Dat) AS theYear, Month(Dat) AS theMonth FROM Diary) GROUP BY 2, 3 ORDER BY 1 DESC

(Jag har redan postat detta ett par gånger, men vi har problem med nätverket)

red: Vid närmare eftertanke kan nog inte det här heller fungera. Men jag försökte i alla fall. ;)

Mvh,

Medlem sedan nov. 2001294 inlägg
#17

Du hade rätt... :(

Medlem sedan dec. 200012 464 inlägg
#18

Jaha, jag har inte tillgång till Jet så jag kan inte testa något.

Du skrev att du inte kunde ha med count(*) c och att du fick ett felmeddelande. Att c är med är väldigt väsentligt så det måste vara med. Vad fick du för felmeddelande?

Eftersom du inte är intresserad av vilken månad det är så kan man förenkla frågan något.

select max(c) from (select count(*) as c from diary 
group by year(dat),month(dat))
Medlem sedan nov. 2001294 inlägg
#19

Tack så mycket! Nu funkade det.

Att c:et inte funkade förut var troligtvis pga att du hade glömt "as" och jag inte förstod bättre än att "as" skulle dit mellan count(*) och c:et.

Medlem sedan dec. 200012 464 inlägg
#20

as skall egentligen inte behövas enligt SQL standard. Det kan vara så att Access kräver det

266 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
136 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
136 ms — ändringar (db)