webForumDet fria alternativet

gruppera sumera och lista

10 svar · 1 044 visningar · startad av evilaid

evilaidMedlem sedan apr. 2009433 inlägg
#1

Hej

Funderar igentligen på vilket som är bästa sättet att lösa problemet..

Om jag har en tabell med en kolumn för färg och en för antal så vill jag skriva ut alla poster efter den ordningen med flest antal först och sen minskande..
Så om det ser ut så här
ID färg Antal
1 röd 2
2 grön 5
3 Blå 1
4 röd 2

Här vill jag skapa en fråga som returnerar dom i ordning, grön, röd och blå?

Är det möjligt eller måse man köra flera frågor för att bestämma utskrifts ordning?

@ndersMedlem sedan juni 200032 969 inlägg
#2
SELECT färg, sum(antal) as TotalAntal
GROUP BY färg
ORDER BY 2 DESC

Tvåan representerar alltså fält nummer två i din selectlista - summan.

Mvh

evilaidMedlem sedan apr. 2009433 inlägg
#3

okey, då är jag med så långt..
Men nu grupperas ju de båda röda.. Saken är den att varje post i tabellen är en order och jag vill skriva ut alla ordrar fast i ovan nämn ordning (färg efter antal), inbördes ordning i samma färg kvittar..

Vet inte om det var bra förklarat, kanske lite snurrigt...

@ndersMedlem sedan juni 200032 969 inlägg
#4

Hmm. Nu läste jag ditt inlägg igen - och ser att jag missade en liten detalj. Då provar vi så här då:

SELECT (SELECT SUM(antal) FROM tabell t2 WHERE t2.färg = t.färg), *
FROM tabell t
ORDER BY 1 DESC

(Ser dessutom att jag missade den lilla detaljen med FROM i mitt första inlägg... :-) )

evilaidMedlem sedan apr. 2009433 inlägg
#5

Ok, ska prova den så fort jag kommer hem ikväll.. Har lite svårt att förstå resultatet när det nestlas SELECT satser i andra.. Hur ska man tänka igentligen, exempelvis i ditt exempel för att förstå vad resultatet blir?

@ndersMedlem sedan juni 200032 969 inlägg
#6

Den nästlade frågan i mitt exempel gör egentligen en join mot själva huvudfrågan. Så om man skriver om SQL-frågan till ren svenska blir det typ:

Hämta alla fält ur tabellen, och för varje post, hämta även den totala summan av antalsfältet där färgen stämmer överens med aktuell post. Sortera sedan på det uträknade fältet.

Det är lite svårt att förklara - men det viktiga är att titta på hur man "kopplar ihop" datat - dvs i det här fallet kopplas tabellen i den nästlade frågan (t2) ihop med tabellen i den yttre, huvudfrågan (t1) på färgfälten.

evilaidMedlem sedan apr. 2009433 inlägg
#7

Det var en sjukt bra förklaraing. Gillar hur du skrev om den till ren svenska! Enkelt om man kunde använda dte språket...

Som jag fattar det så för varje rad som hämtas så körs den nästlade frågan en gång?

@ndersMedlem sedan juni 200032 969 inlägg
#8

Som jag fattar det så för varje rad som hämtas så körs den nästlade frågan en gång?

Ja precis, det är en nackdel. I vissa sammanhang (med mycket data till exempel), kanske det inte är applicerbart med en sådan subquery - men det "märker man".

evilaidMedlem sedan apr. 2009433 inlägg
#9

OKey..

Min tabell kommer byggas rätt fort och snart hamna på några hundratusen poster som den söka igenom, är det mycket?

@ndersMedlem sedan juni 200032 969 inlägg
#10

Hur många färger är det tal om? Eller är det här bara ett fiktivt scenario?
Det finns alltid saker man kan göra för att tjäna prestanda.

Just i detta sammanhang hade jag nog gjort en stored procedure som först räknar in färgerna i en tabellvariabel (en temporär tabell i serverns minne), och sedan använt den istället för att göra en summering i den nästlade frågan. Kan se ut typ så här:

declare @ctable table (färg varchar(20), totalsumma int)
insert into @ctable 
     select färg, sum(antal) from tabell
     group by färg
select (select totalsumma from @ctable t2 where t2.färg = t.färg), *
from tabell t
order by 1 desc

Här räknas alltså totalsummorna bara ut en gång per färg, och sedan gör du ju bara en select mot en pyttetabell i subqueryn.

evilaidMedlem sedan apr. 2009433 inlägg
#11

Nepp det är inget fiktivt utan ordeerraderna kommer byggas på rätt fort, det är dock bara 9 olika färger men det kommer ju bli många poster som ska sökas, urvalet kommer inte blir så stort men jag antar att det är totalt antal rader som genomsökes som påverkar prestandan?

Jag förstår faktiskt kodexemplet :)
Har bara använt mig av SP när jag gjorde en webbtracker men ska kolla lite närmare på det ikväll !!

Stort tack för mycket bra information och exemplen!

130 ms totalt · 3 externa anrop · v20260731065814-full.b943c234
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)