webForumDet fria alternativet

summera kolumner?

10 svar · 897 visningar · startad av tanten

tantenMedlem sedan nov. 20051 596 inlägg
#1

Jag har lite svårt att ställa min fråga, men jag har en sql som ser ut så här:

SELECT count( loppID ) AS antal, 
sum( if( placering = '1', 1, 0 ) ) AS vinst, 
sum( if( placering = '2', 1, 0 ) ) AS andra, 
sum( if( placering = '3', 1, 0 ) ) AS tredje, 
sum( if( placering = '4', 1, 0 ) ) AS fyra, 
sum( if( placering = '5', 1, 0 ) ) AS femte, 
sum( summa ) AS pris, 
sum( summa ) * 1.4584 AS skr, 
ban_name
FROM start s
JOIN bana b ON b.banID = s.banID
WHERE kuskID =1
AND problemID <9
AND datum >= '2009-01-01'
GROUP BY s.banID
ORDER BY ban_name

och den ger följande output, som på bilden.
Går det att på något sätt att också få den att summera ner kolumnerna? Eller?
Tacksam för tips...
använder Mysql

statistik.jpg
nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Denna kod bör om allt funkar som det ska summera raderna i ursprungsfrågan och lägga summorna i en rad i botten. Koden bör funka, men det går säkert att göra snyggare, och i så fall kommer LarsG med stor sannolikhet visa hur. §e
Grundidén i min kod är att man först hämtar ursprungsfrågan som en subquery, och gör en UNION ALL för att få en tom rad i botten. Sedan använder man ett antal variabler som räknare. I den yttre selecten returneras alltid det riktiga värdet förutom om lastrow är sant (vilket det är för den sista, tomma raden), då visas summan.

SET @counter_antal := 0,
 @counter_vinst := 0,
 @counter_andra := 0,
 @counter_tredje := 0,
 @counter_fyra := 0,
 @counter_femte := 0,
 @counter_pris := 0,
 @counter_skr := 0;

SELECT 
 if(t1.lastrow, @counter_antal, t1.antal) AS antal,
 if(t1.lastrow, @counter_vinst, t1.vinst) AS vinst,
 if(t1.lastrow, @counter_andra, t1.andra) AS andra,
 if(t1.lastrow, @counter_tredje, t1.tredje) AS tredje,
 if(t1.lastrow, @counter_fyre, t1.fyra) AS fyra,
 if(t1.lastrow, @counter_femte, t1.femte) AS femte,
 if(t1.lastrow, @counter_pris, t1.pris) AS pris,
 if(t1.lastrow, @counter_skr, t1.skr) AS skr,

 @counter_antal := @counter_antal + t1.antal,
 @counter_vinst := @counter_vinst + t1.vinst,
 @counter_andra := @counter_andra + t1.andra,
 @counter_tredje := @counter_tredje + t1.tredje,
 @counter_fyra := @counter_fyra + t1.fyra,
 @counter_femte := @counter_femte + t1.femte,
 @counter_pris := @counter_pris + t1.pris,
 @counter_skr := @counter_skr + t1.skr
FROM
(
 SELECT count( loppID ) AS antal,  
  sum( if( placering = '1', 1, 0 ) ) AS vinst,  
  sum( if( placering = '2', 1, 0 ) ) AS andra,  
  sum( if( placering = '3', 1, 0 ) ) AS tredje,  
  sum( if( placering = '4', 1, 0 ) ) AS fyra,  
  sum( if( placering = '5', 1, 0 ) ) AS femte,  
  sum( summa ) AS pris,  
  sum( summa ) * 1.4584 AS skr,  
  ban_name, 
  0 AS lastrow
 FROM start s 
 JOIN bana b ON b.banID = s.banID 
 WHERE kuskID =1 
  AND problemID <9 
  AND datum >= '2009-01-01' 
 GROUP BY s.banID 
 ORDER BY ban_name 

UNION ALL
/* Dummy-rad som ersätts med summan (UNION fogar samman resultaten) */
 SELECT
  0 AS antal,  
  0 AS vinst,  
  0 AS andra,  
  0 AS tredje,  
  0 AS fyra,  
  0 femte,  
  0 AS pris,  
  0 AS skr,  
  'SUMMA' AS ban_name,
  1 AS lastrow
) t1
tantenMedlem sedan nov. 20051 596 inlägg
#3

Oj... Tack så himla mycket!
Var mycket nytt där.
Körde det lokalt men fick Incorrect usage of UNION and ORDER BY, så något blev fel... ditt stavfel fyre upptäckte jag.
Ska kolla vidare :OO

nitro2k01Medlem sedan aug. 20039 342 inlägg
#4
SET @counter_antal := 0,
 @counter_vinst := 0,
 @counter_andra := 0,
 @counter_tredje := 0,
 @counter_fyra := 0,
 @counter_femte := 0,
 @counter_pris := 0,
 @counter_skr := 0;

SELECT 
 if(t1.lastrow, @counter_antal, t1.antal) AS antal,
 if(t1.lastrow, @counter_vinst, t1.vinst) AS vinst,
 if(t1.lastrow, @counter_andra, t1.andra) AS andra,
 if(t1.lastrow, @counter_tredje, t1.tredje) AS tredje,
 if(t1.lastrow, @counter_fyra, t1.fyra) AS fyra,
 if(t1.lastrow, @counter_femte, t1.femte) AS femte,
 if(t1.lastrow, @counter_pris, t1.pris) AS pris,
 if(t1.lastrow, @counter_skr, t1.skr) AS skr,

 @counter_antal := @counter_antal + t1.antal,
 @counter_vinst := @counter_vinst + t1.vinst,
 @counter_andra := @counter_andra + t1.andra,
 @counter_tredje := @counter_tredje + t1.tredje,
 @counter_fyra := @counter_fyra + t1.fyra,
 @counter_femte := @counter_femte + t1.femte,
 @counter_pris := @counter_pris + t1.pris,
 @counter_skr := @counter_skr + t1.skr
FROM
(
 (
 SELECT count( loppID ) AS antal,  
  sum( if( placering = '1', 1, 0 ) ) AS vinst,  
  sum( if( placering = '2', 1, 0 ) ) AS andra,  
  sum( if( placering = '3', 1, 0 ) ) AS tredje,  
  sum( if( placering = '4', 1, 0 ) ) AS fyra,  
  sum( if( placering = '5', 1, 0 ) ) AS femte,  
  sum( summa ) AS pris,  
  sum( summa ) * 1.4584 AS skr,  
  ban_name, 
  0 AS lastrow
 FROM start s 
 JOIN bana b ON b.banID = s.banID 
 WHERE kuskID =1 
  AND problemID <9 
  AND datum >= '2009-01-01' 
 GROUP BY s.banID 
 ORDER BY ban_name 
 )
UNION ALL
 (
/* Dummy-rad som ersätts med summan (UNION fogar samman resultaten) */
 SELECT
  0 AS antal,  
  0 AS vinst,  
  0 AS andra,  
  0 AS tredje,  
  0 AS fyra,  
  0 femte,  
  0 AS pris,  
  0 AS skr,  
  'SUMMA' AS ban_name,
  1 AS lastrow
 )
) t1

Hmm, kan vara så att ett par extra parenteser löser problemet med union/group by

tantenMedlem sedan nov. 20051 596 inlägg
#5

Jag provade att ta bort order by helt eftersom den inte är nödvändig och då blev det en massa Null vid alla hopräkningarna och likadant blev det med ditt senaste förslag... dessutom tappas ban_name bort... fast jag tycker det ser så riktigt ut... så jag förstår inte hur jag ska prova vidare...

LarsGMedlem sedan dec. 200012 464 inlägg
#6
select count(loppID) AS antal, 
       sum(case when placering = 1 then 1 else 0 end) AS vinst, 
       sum(case when placering = 2 then 1 else 0 end) AS andra, 
       sum(case when placering = 3 then 1 else 0 end) AS tredje, 
       sum(case when placering = 4 then 1 else 0 end) AS fyra, 
       sum(case when placering = 5 then 1 else 0 end) AS femte, 
       sum(summa) AS pris, 
       sum(summa)*1.4584 AS skr, 
       ban_name
  from start s
  join bana b 
    om b.banID = s.banID
 where kuskID = 1
   and problemID < 9
   and datum >= '2009-01-01'
 group by s.banID with rollup
 order by ban_name
nitro2k01Medlem sedan aug. 20039 342 inlägg
#7

...och så slog profetian in, och så har även jag lärt mig något nytt idag. :)

Peter SMedlem sedan dec. 20025 483 inlägg
#8

LarsG: ett litet syntaxfel har mystiskt smugit sig in nära 'join'.

tantenMedlem sedan nov. 20051 596 inlägg
#9

LarsG Det fungerade med hopräkningarna om jag tog bort Order by-raden.
Med den kvar får jag #1221 - Incorrect usage of CUBE/ROLLUP and ORDER BY

Peter S... om har jag ändrat till on, antar det var det du menade.

Har försökt att få till ett alias-namn för den nya raden, men lyckas inte.
Har försökt se hur du gjorde i ditt PM nitro2k01, men jag får inte till det. Nu blir det den sista inlagda banans namn som får alla summorna, men jag ska försöka vidare...:-)

tantenMedlem sedan nov. 20051 596 inlägg
#10

Nu lade jag till denna rad överst SELECT IFNULL( ban_name, "Totalt" ) AS ban_name, och ändrade GROUP BY s.banID till GROUP BY ban_name i stället på LarsG:s förslag och det fungerade super!!!
NU ska jag bara se om jag kan få till sorteringen också.

tantenMedlem sedan nov. 20051 596 inlägg
#11

Nu fungerar det.
Tack så mycket Alla!
Jag upptäckte att om jag ändrade till SELECT IFNULL( ban_name, "Totalt" ) AS totalt,
så fick inte raden något namn, men banorna sorterades i bokstavordning??? men det blev snyggt :-)

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