webForumDet fria alternativet

Summera ihop massa grejer i samma SQL-fråga...

17 svar · 969 visningar · startad av oskars

oskarsMedlem sedan nov. 20051 317 inlägg
#1

Hallå!

Jag har en liten fråga :)

Kan jag summera ihop massa olika tal från en tabell i samma SQL-fråga?

Så här ungefär:

SELECT * FROM minTabell COUNT(intAlt = 1) AND COUNT(intAlt2 = 1) AND COUNT(intAlt3 = 1) WHERE sID = 200

och så loopar man ut det så att det ser ut så här typ:

sID         intAlt      intAlt2     intAlt3
200        10          5           12

Den ska alltså summera ihop antal poster som har exempelvis intAlt = 1 och där sID = 200

Nu kan jag förstå om jag förklarat konstigt, men jag hoppas ni förstår!

Går det att göra så här?

:stud

Peter SMedlem sedan dec. 20025 483 inlägg
#2
SELECT SUM(case when intAlt  = 1 then 1 else 0 end)
     , SUM(case when intAlt2 = 1 then 1 else 0 end)
     , SUM(case when intAlt3 = 1 then 1 else 0 end)
  FROM minTabell
 WHERE sID = 200
oskarsMedlem sedan nov. 20051 317 inlägg
#3

kooolt! Tack tack!

Men hur skriver jag när jag ska loopa ut de ihopräknade siffrorna? :)

Tack återigen!

oskarsMedlem sedan nov. 20051 317 inlägg
#4

Peter S skrev:

SELECT SUM(case when intAlt  = 1 then 1 else 0 end)
     , SUM(case when intAlt2 = 1 then 1 else 0 end)
     , SUM(case when intAlt3 = 1 then 1 else 0 end)
  FROM minTabell
 WHERE sID = 200

typ så här?

SELECT SUM(case when intAlt  = 1 then 1 else 0 end) AS antal1
     , SUM(case when intAlt2 = 1 then 1 else 0 end) AS antal2
     , SUM(case when intAlt3 = 1 then 1 else 0 end) AS antal3
  FROM minTabell
 WHERE sID = 200

Ska testa det snart :D :D :D :D

oskarsMedlem sedan nov. 20051 317 inlägg
#5

Njaeh, den vill inte...

kolla här:

<table width="100%" border="0" cellpadding="5" cellspacing="0" style="margin:0 0 20px 0;background:#9999ff;text-align:left;">
	<tr style="background:#333;color:#FFF;">
		<td width="50%"><b>Namn</b></td>
		<td width="10%"><b>Ordrar#</b></td>
		<td width="20%"><b>Telefonånger</b></td>
	</tr>
<%
	getDatabase = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=; DATABASE=; UID=;PASSWORD=; OPTION=3"

	Set Connect = Server.CreateObject("ADODB.Connection")
	Connect.Open = getDatabase

	Set Recset = Server.CreateObject("ADODB.Recordset")
	SQL = "Select * FROM Users WHERE Grad = 1 ORDER BY Namn asc"
	RecSet.Open SQL, Connect, 1, 2
	
	If RecSet.EOF Then
		Response.Write("Tomt!")
	Else
	
	Color = "EEE"
	Do Until RecSet.EOF
	
		' Summa antalet KOrder = 1 och antalet KOrder = 2
		Set oCount = Connect.Execute("SELECT SUM(case when KOrder = 1 then 1 else 0 end) as antalOrdrar, SUM(case when KOrder = 2 then 1 else 0 end) as antalTelanger FROM Arkiv WHERE sID = '"&RecSet("sID")&"'")
		antalOrdrar = oCount("antalOrdrar")
		antalTelanger = oCount("antalTelanger")
		oCount.close
		Set oCount=nothing
						
		
		procentAntal = procentAntalGS + procentAntalOrdrar
		

	%>
	<tr style="background:#<%=Color%>;">
		<td><%=RecSet("Namn")%></td>
		<td><%=antalOrdrar%></td>
		<td><%=antalTelanger%></td>
	</tr>
	
	<%
	
		If Color = "EEE" Then
			Color = "FCFCFC"
		Else
			Color = "EEE"
		End If
	
	RecSet.MoveNext
	Loop
	End If
%>
</table>

Feltyp: ADODB.Recordset (0x800A0CC1) Objektet kunde inte hittas i mängden med det begärda namnet eller numret.

Vad har jag gjort för fel?

@ndersMedlem sedan juni 200032 969 inlägg
#6

Vilken rad pekar felet på då?

oskarsMedlem sedan nov. 20051 317 inlägg
#7
Set oCount = Connect.Execute("SELECT SUM(case when KOrder = 1 then 1 else 0 end) as antalOrdrar, SUM(case when KOrder = 2 then 1 else 0 end) as antalTelanger FROM Arkiv WHERE sID = '"&RecSet("sID")&"'")

:)

@ndersMedlem sedan juni 200032 969 inlägg
#8

TJa, då finns väl inte fältet sID i RecSet?

oskarsMedlem sedan nov. 20051 317 inlägg
#9

löjligt. jag skäms.

oskarsMedlem sedan nov. 20051 317 inlägg
#10

Det fungerar så otroligt vackert nu! Jag tror inte ni vill veta hur jag löste samma problem på ett annat sätt! Då måste ni säga till i så fall :D

oskarsMedlem sedan nov. 20051 317 inlägg
#11

Hur gör jag om jag vill hämta två olika data från två olika tabeller på samma sätt?

säg att jag vill kolla om intAlt1 = 1 i minTabell1 och intAlt2 = 1 i minTabell2

hm... och hur gör man egenltigen för att sortera efter t.ex "antalOrdrar".. ORDER BY antalOrdrar funkar inte i SQL-frågan ovan!

LarsGMedlem sedan dec. 200012 464 inlägg
#12

säg att jag vill kolla om intAlt1 = 1 i minTabell1 och intAlt2 = 1 i minTabell2

Kan du vara mer specifik? Ge exempel på datainnehåll och förväntat resultat.

hm... och hur gör man egenltigen för att sortera efter t.ex "antalOrdrar".. ORDER BY antalOrdrar funkar inte i SQL-frågan ovan!

På vilket sätt fungerar det inte? Återigen, var mer specifik.

oskarsMedlem sedan nov. 20051 317 inlägg
#13

LarsG skrev:

säg att jag vill kolla om intAlt1 = 1 i minTabell1 och intAlt2 = 1 i minTabell2

Kan du vara mer specifik? Ge exempel på datainnehåll och förväntat resultat.

.

Summering av antal poster, precis som ovan :)

LarsG skrev:

hm... och hur gör man egenltigen för att sortera efter t.ex "antalOrdrar".. ORDER BY antalOrdrar funkar inte i SQL-frågan ovan!

På vilket sätt fungerar det inte? Återigen, var mer specifik.

Kort och gott så sorteras inte listan efter det jag specificerat. Det rör sig inte överhuvudtaget. :r

LarsGMedlem sedan dec. 200012 464 inlägg
#14

Det är fortfarande för vagt.

oskarsMedlem sedan nov. 20051 317 inlägg
#15

Ska försöka lösa mitt sista problem här...

Med följande kod, får jag följande felmeddelande:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E31)
[MySQL][ODBC 3.51 Driver][mysqld-5.0.24a-community-nt]The used SELECT statements have a different number of columns

Jag har trippelkollat så att dom båda tabellerna har rätta antalet kolumner, och alla kolumnerna har rätt egenskaper... varför funkar det inte för? Det jag vill göra är att räkna ihop lite grejer (vad ser ni nedanför) från 2st olika kolumner!

' Summa antalet KOrder = 1 och antalet KOrder = 2
Set oCount = Connect.Execute("SELECT SUM(case when KOrder = 1 then 1 else 0 end) as antalOrdrar, " & _
							         "SUM(case when KOrder = 2 then 1 else 0 end) as antalTelanger, " & _
							         "SUM(case when KOrder = 3 then 1 else 0 end) as antalReturer, " & _
							         "SUM(case when KOrder = 4 then 1 else 0 end) as antalAA, " & _
							         "SUM(case when KOrder = 6 then 1 else 0 end) as antalSlutbetalda " & _
							         "FROM Arkiv WHERE sID = '"&RecSet("Namn")&"' " & _
							         "UNION SELECT SUM(case when KOrder = 5 then 1 else 0 end) as antalEjgodkanda " & _
							         "FROM ArkivUtanOrdernummer WHERE sID = '"&RecSet("Namn")&"'")
antalOrdrar = oCount("antalOrdrar")
antalTelanger = oCount("antalTelanger")
antalReturer = oCount("antalReturer")
antalAA = oCount("antalAA")
antalSlutbetalda = oCount("antalSlutbetalda")
antalEjgodkanda = oCount("antalEjgodkanda")
oCount.close
Set oCount=nothing
@ndersMedlem sedan juni 200032 969 inlägg
#16

Du måste ha samma antal fält i dina UNION-delar.

SELECT första_fältet, andra_fältet, tredje_fältet
UNION
SELECT fjärde_fältet, femte_fältet, sjätte_fältet

inte

SELECT första_fältet, andra_fältet, tredje_fältet, fjärde_fältet, femte_fältet
UNION
SELECT sjätte_fältet

Om du vill ha med en till summa från en annan tabell, lägg med det som en subquery då istället.

oskarsMedlem sedan nov. 20051 317 inlägg
#17

Jag har sökt på "sub query" på google... och fått fram det här: http://www.smart-soft.co.uk/Oracle/advanced-sql-tutorial.htm

nu är frågan hur jag gör en subquery tíll min sql-fråga... har försökt att fixa det själv innan jag frågar, men jag förstår inte riktigt hru man gör :/

@ndersMedlem sedan juni 200032 969 inlägg
#18

Det som är inom parentes är din subquery:

SELECT 
	första_fältet, andra_fältet, tredje_fältet, fjärde_fältet, femte_fältet,
	(SELECT sjättefältet FROM någon_tabell) AS sjätte_fältet
FROM
	tabell
...
133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)