webForumDet fria alternativet

Slopa dubletter men ändå räkna ihop timmarna?

Databaser & SQL

2 svar · 588 visningar · startad av Bosse168

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

Använder denna ful-kod för få ut inskrivna timmar men finns det något sätt att räkna ihop timmarna utan att skriva ut dubletterna? Så här skrivs det ut nu:
Övrigt 80
Övrigt 26
Mil 40
Mil 21

<%
Dim ob50,ob100

strTimmar=0

	SQL="SELECT arbetsplats, kneg_id,start_datum,id, totalt_tim_ob_50, totalt_tim_ob_100 FROM arbetsrapporter WHERE arbets_status=1 AND arbetsplats='"& SafeSQL(Request.QueryString("arbetsplats")) &"' ORDER BY start_datum"

Set Rs = Connect.Execute(SQL)

If not Rs.EOF Then

		Do Until Rs.EOF

					Set Rs2 = Connect.Execute("SELECT * FROM typ_av_jobb")
					
					
					Do Until Rs2.EOF
					
						Set Rs3 = Connect.Execute("SELECT SUM( utford_tid ) as totalt FROM utfort_arbete WHERE arbetsrapport_id ='"& Rs("id") &"' AND typ_av_jobb_id='"& Rs2("id") &"'")

						
						If Rs3("totalt")<>"" Then
						
						strTimmar=strTimmar+Rs3("totalt")
						%>
									<tr>
									  <td><%=Rs2("namn")%></td>
									  <td><%=Rs3("totalt")%></td>
									  <td><%=Rs2("a-pris")%></td>
									  <td><%=strSumman%></td>
									</tr>
									<tr>
									  <td colspan="4" bgcolor="#666666" height="1"></td>
									  </tr>
									  <%
						End If
						strSumman=0
						Rs3.Close : Set Rs3=nothing	
					Rs2.MoveNext
					Loop
					Rs2.Close : Set Rs2=nothing	
		Rs.MoveNext
		Loop
End If
Rs.Close : Set Rs=nothing		
%>
Medlem sedan dec. 20025 483 inlägg
#2

Hur definierar du en dubblett?

Medlem sedan aug. 20039 340 inlägg
#3

Denna fråga bör, med reservation för stavfel och tankefel, hämta all data du vill ha ut med en fråga. Den innehåller dock nog ett par saker du inte har sett förut, förklaring nedan.

" <- Ignorera. Det cittatecknet finns bara där för att lura forumet att färgkoda SQL'en.
SQL = "SELECT "&_
"    r.arbetsplats, r.kneg_id, r.start_datum, r.id AS r_id, r.totalt_tim_ob_50, r.totalt_tim_ob_100 "&_
"    t.id AS t_id, t.namn, t.`a-pris`, "&_
"    SUM( a.utford_tid ) as totalt "&_
"FROM arbetsrapporter r, typ_av_jobb t "&_
"LEFT JOIN utfort_arbete a ON a.arbetsrapport_id = r.id AND a.typ_av_jobb_id = t.id"&_
"WHERE "&_
"    a.arbets_status=1 AND "&_
"    a.arbetsplats='"& SafeSQL(Request.QueryString("arbetsplats")) & "'   "&_
"GROUP BY r.id, t.id "&_
"ORDER BY r.start_datum, t.namn "
  • Först av allt det första cittattecknet. Det finns där enbart för att lura forumets kod att färglägga SQL-koden. Det ska alltså inte kopieras in i din kod

  • För att göra SQL-koden mer läsbar har jag delat upp den över flera rader. För att slippa slå ihop allt till en rad har jag använt ett trick i ASP där man har en sträng på varje rad och använder & för att sammanfoga raderna. _ på slutet av en rad gör att raderna sammanfogas.

    "FROM arbetsrapporter r, typ_av_jobb t "&_
    "LEFT JOIN utfort_arbete a ON a.arbetsrapport_id = r.id AND a.typ_av_jobb_id = t.id"
    
    ...är alltså samma sak som...
    
    "FROM arbetsrapporter r, typ_av_jobb t "&"LEFT JOIN utfort_arbete a ON a.arbetsrapport_id = r.id AND a.typ_av_jobb_id = t.id"
    
    ...som i sin tur är samma sak som 
    
    "FROM arbetsrapporter r, typ_av_jobb t LEFT JOIN utfort_arbete a ON a.arbetsrapport_id = r.id AND a.typ_av_jobb_id = t.id"
    
    ...efter sammanfogning av strängarna
    

    Notera två saker.

    1. _ måste stå allra sist på raden, du kan inte ha mellanslag eller annat efter _-tecknet.
    2. I exemplet ovan har jag ett mellanslag efter typ_av_jobb t. Skulle du inte ha det mellanslaget där så skulle den biten av strängen slås ihop till ...typ_av_jobb tLEFT... vilket skulle ge syntaxfel iochmed att det inte finns något som heter tLEFT.
  • Jag använder joins i koden. Jag tänker inte beskriva i detalj hur dessa fungerar, men de knyter ihop innehållet i två eller flera tabeller och undviker konstruktioner som ...arbetsrapport_id ='"& Rs("id") &"' ...

  • Jag skapar alias för tabellnamnen som typ arbetsrapporter r vilket gör att man kan komma åt värden från den tabellen genom att skriva t ex r.id. Detta är behändigt för att skapa ordning och dessutom nödvändigt när du har fler kolumner med samma namn, som id, för att skilja dessa åt.

  • När du hämtar ut dessa två id-värden måste du även skapa alias för själva kolumn-namnen, t ex r.id AS r_id. Du måste uppenbarligen skriva Rs3("r_id") resp. Rs3("t_id") för att plocka ut dessa värden.

  • Kolumnen a-pris kan tolkas som "a minus pris" och ge ett syntaxfel. Det löser man genom att sätta namnet inom `` (grav accent). De grava accenterna fungerar som ett slags citattecken för tabell- samt kolumn-namn. Bör ej blandas ihop med '' (enkelcitat).

  • För att beräkna summan på önskat sätt använder jag SUM() tillsammans med GROUP BY r.id, t.id. GROUP BY grupperar resultatet efter kombinationer av rapporter och arbetstyp. För varje kombination beräknas summan av arbetstimmar.

  • Allra sist sorteras resultatet efter startdatum, och sedan namn.

Det var nog allt. Om något är oklart eller om koden inte funkar, fråga...

Justja en sak till... Ang. tabellen typ_av_jobb... Hur mycket data finns där? Eventuellt kan det vara en idé att lagra informationen i den som en kolumn i arbetsrapporter.

256 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)