webForumDet fria alternativet

Hämta endast ett datum för varje adress.

Databaser & SQL

18 svar · 404 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Tja!

Har en SQL fråga för att plocka ut Servicedatum för vissa adresser, där senaste service är utförd för minst 4 månader sen:

strSQL =	"SELECT h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID, s.Service_Datum " &_
				"FROM tbl_hiss h INNER JOIN tbl_service s " &_
				"ON h.Hiss_ID = s.Hiss_ID " &_
				"WHERE h.Hiss_Ans_Montor = '" & Session("logged_in_usr") & "' AND DateDiff('m', s.Service_Datum, date()) > 4 " &_
				"ORDER BY h.Hiss_Adress, h.Hiss_Gatunummer, s.Service_Datum ASC"

Problemet är bara att den plockar ut fler datum för samma adress.
Tex. om man varit på samma ställe, vid två olika datum, så ska endast det datum som ligger närmast den aktuella månaden.

Hoppas ni förstår, om inte, be mig förklara tydligare.
Jag vill alltså ENDAST plocka ut ett besök för resp. adress.

Tack!

Medlem sedan dec. 200012 464 inlägg
#2
SELECT h.Hiss_ID, h.Hiss_Adress, 
 h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID, [b]max(s.Service_Datum) as mdatum[/b] 
FROM tbl_hiss h INNER JOIN tbl_service s ON h.Hiss_ID = s.Hiss_ID
WHERE h.Hiss_Ans_Montor = Session("logged_in_usr")  
AND DateDiff('m', s.Service_Datum, date()) > 4 
[b]group by h.Hiss_ID, h.Hiss_Adress, 
 h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID [/b]
ORDER BY h.Hiss_Adress, h.Hiss_Gatunummer,[b]mdatum[/b]
Medlem sedan feb. 20034 441 inlägg
#3

Aha, tack, ska prova när jag kommer hem, tack tack!

Medlem sedan feb. 20034 441 inlägg
#4

Såhär har jag gjort:

strSQL =	"SELECT h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID, max(s.Service_Datum) as mdatum " &_
				"FROM tbl_hiss h INNER JOIN tbl_service s ON h.Hiss_ID = s.Hiss_ID " &_
				"WHERE h.Hiss_Ans_Montor = " & Session("logged_in_usr") & " AND DateDiff('m', s.Service_Datum, date()) > 4 " &_
				"GROUP BY h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID " &_
				"ORDER BY h.Hiss_Adress, h.Hiss_Gatunummer, mdatum"

...vilket resulterar i:

Feltyp:
Microsoft JET Database Engine (0x80040E10)
Det har inte angetts något värde för en eller flera nödvändiga parametrar.
/hissen/register/mService.asp, line 35

Det tyder väl på ett stavfel? Jag hittar inget sådant, så vad kan vara fel i koden.?

Medlem sedan dec. 200012 464 inlägg
#5

apostroferna för session(...) försvann visst när jag rattade runt

Medlem sedan feb. 20034 441 inlägg
#6

Nu finns '' runt Session, men fortf. samma fel.
Jag förstår ingenting av det här.

Medlem sedan dec. 200012 464 inlägg
#7
strSQL =	"SELECT h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID, max(s.Service_Datum) as mdatum " &_
				"FROM tbl_hiss h INNER JOIN tbl_service s ON h.Hiss_ID = s.Hiss_ID " &_
				"WHERE h.Hiss_Ans_Montor = '" & Session("logged_in_usr") & "' AND DateDiff('m', s.Service_Datum, date()) > 4 " &_
				"GROUP BY h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID " &_
				"ORDER BY h.Hiss_Adress, h.Hiss_Gatunummer, mdatum"
Medlem sedan feb. 20034 441 inlägg
#8

Precis så ser min kod redan ut, men får samma felmess ändå.
Innan jag (du ;)) modifierade SQLfrågan, så funkade det, det bör alltså vara ngt som har med mdatum att göra?

Medlem sedan dec. 200012 464 inlägg
#9

ja visst ja. Access klarar inte av att man använder alias i order by. Antingen får du skriva dit max(s.service_datum) i order by eller så får man ange ordningsnumret som uttrycket har i select-listan.

Medlem sedan feb. 20034 441 inlägg
#10

Såhär har jag gjort:

strSQL =	"SELECT h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID, max(s.Service_Datum) " &_
				"FROM tbl_hiss h INNER JOIN tbl_service s ON h.Hiss_ID = s.Hiss_ID " &_
				"WHERE h.Hiss_Ans_Montor = '" & Session("logged_in_usr") & "' AND DateDiff('m', s.Service_Datum, date()) > 4 " &_
				"GROUP BY h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID " &_
				"ORDER BY h.Hiss_Adress, h.Hiss_Gatunummer, max(s.Service_Datum)"

Samma felmess...

Medlem sedan dec. 200012 464 inlägg
#11

Nu känner jag mig något tappad. Vad händer om du tar bort max(s.Service_Datum) från order by?

Medlem sedan feb. 20034 441 inlägg
#12

LarsG skrev:

Nu känner jag mig något tappad. Vad händer om du tar bort max(s.Service_Datum) från order by?

Samma felmess...
Måste alltså vara fel ngn annanstans?

Medlem sedan dec. 200012 464 inlägg
#13

Om du skriver ut frågan och kör den direkt i Access så brukar det ge bättre felmeddelande.

Medlem sedan feb. 20034 441 inlägg
#14

Den jobbiga biten i det här är att det funkar klockrent när jag provar i Access.

SELECT h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID, max(s.Service_Datum) FROM tbl_hiss h INNER JOIN tbl_service s ON h.Hiss_ID = s.Hiss_ID WHERE h.Hiss_Ans_Montor = '{4E76A517-11AD-4D5B-A9C4-3C9E968B193E}' AND DateDiff('m', s.Service_Datum, date()) > 4 GROUP BY h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID ORDER BY h.Hiss_Adress, h.Hiss_Gatunummer

Ovanstående provade jag och det funkar klockrent som sagt.

Vad är det som gör att det inte funkar när jag kör:

strSQL =	"SELECT h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID, max(s.Service_Datum) " &_
				"FROM tbl_hiss h INNER JOIN tbl_service s ON h.Hiss_ID = s.Hiss_ID " &_
				"WHERE h.Hiss_Ans_Montor = '" & Session("logged_in_usr") & "' AND DateDiff('m', s.Service_Datum, date()) > 4 " &_
				"GROUP BY h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID " &_
				"ORDER BY h.Hiss_Adress, h.Hiss_Gatunummer"
'Response.Write(strSQL)
'Response.End
Set oRec = oConn.Execute(strSQL)
Medlem sedan dec. 200012 464 inlägg
#15

Gör du connect till rätt databas?

Medlem sedan feb. 20034 441 inlägg
#16

Japps, med tanke på att allt funkade schysst till det att du ändrade lite i SQL frågan, så ja.

Jag förstår ingenting av det här.

Medlem sedan feb. 20034 441 inlägg
#17

Hmm, det här verkar ha runnit ut i sanden.
Det som är konstigt att ovanstående SQL fråga funkar bra och ger rätt resultat när jag kör den direkt i Access.

Men kör jag den med min aspfil så får jag som sagt:

Feltyp:
Microsoft JET Database Engine (0x80040E10)
Det har inte angetts något värde för en eller flera nödvändiga parametrar.
/hissen/register/mService.asp, line 35

´Är det någon som vet varför det blir såhär?
Trodde frånbörjan att det berodde på en / flera felstavning(ar), men har kollat och allt ser schysst ut.

Ngra andra förslag?

Medlem sedan feb. 20034 441 inlägg
#18

Hej igen!

Nu skulle jag verkligen behöva lösa det här.
Finns det något sett att göra om hela frågan, så att jag får samma resultat, fast utan felmess?

Kan det bero på min databaskoppling, på mitt rekordset, eller vad?
Vore väldigt tacksam om någon visste ett svar på det här, för det är rätt viktigt för min del att få snurr på koden.

Medlem sedan feb. 20034 441 inlägg
#19

Hej!

Nu tog jag tag i det här och har fått igång det halvdant:

strSQL =	"SELECT h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, " &_
				"s.Hiss_ID, max(s.Service_Datum) as mdatum, s.Service_Anm, s.Service_ID " &_
				"FROM tbl_hiss AS h INNER JOIN tbl_service AS s ON h.Hiss_ID = s.Hiss_ID " &_
				"WHERE h.Hiss_Ans_Montor = '{4E76A517-11AD-4D5B-A9C4-3C9E968B193E}' AND DateDiff('m', s.Service_Datum, date()) = 4 " &_
				"GROUP BY h.Hiss_ID, h.Hiss_Adress, h.Hiss_Gatunummer, h.Hiss_Uppg, h.Hiss_Area, h.Hiss_Ans_Montor, s.Hiss_ID, s.Service_Anm, s.Service_ID " &_
				"ORDER BY h.Hiss_Adress, h.Hiss_Gatunummer;"

Nu har jag bara en grej kvar med det här, som jag hoppas att någon kan hjälpa mig med.
Den här frågan ska ju visa de objekt där "Service_Datum" är MER (>) än 4 månader från aktuell månad.

Som det är nu visar den alla äldre, vilket är lite jobbigt. Jag vill alltså att den ska plocka ut endast den senaste av de poster är äldre än 4 månader.

Hur ska jag göra?

265 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
136 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
135 ms — ändringar (db)