terry, i dit eksempel har du også en ( for meget, hvis du tæller efter :-)
SELECT Hour AS Klokke, (SELECT AVG(Sekunder) FROM t1 WHERE sekunder <= 10) AS mineskunder
burde være i orden.
Jeg har brugt AVG (gennemsnit), men man kan, som terry siger, bruge en hvilken som helst funktion eller afgrænsning, bare det altid kun returneres 1 række.
Men det er funktion man skal bruge med omhu, da den jo bliver udfør for hver række der returneres fra "hovedforespørgslen". Den type subselects har derfor et dårligt ry mht. hastighed.
okay tak, det ser ud til at virke, men jeg stadig det problem at jeg ikke kan have flere select sætninger efter hinanden. Jeg skal nemlig lave en forespørgsel der laver en tabel oversigt fordelt på timer nedad, og med kolonner henad der er fordelt på intervaller af sekunder
fx. således: (Sek < 10) (Sek >10 og <40) 07.00-08.00 tal 1 tal2 08.00-09.00 tal 3 tal ..n osv nedad
Kan dette lade sig gøre, og har i noget forslag til hvordan ?
Jeg tænkte noget i denne retning: SELECT Hour AS Klokke, (SELECT AVG(Sekunder) FROM t1 WHERE sekunder <= 10) AS mineskunder,(SELECT AVG(Sekunder) FROM t1 WHERE sekunder > 10 and sekunder <40) AS mineskunder
,,, men den ser ikke ud til at ville godtage flere select på denne måde efter hinanden
SELECT Hour AS Klokke, SUM(CASE WHEN Sekunder < 10 THEN 1 else 0 END) AS Under10Sek, SUM(CASE WHEN Sekunder < 10 THEN 0 WHEN < 40 THEN 1 ELSE 0 END) AS Mellem10og39Sek, SUM(CASE WHEN Sekunder < 40 THEN 0 ELSE 1 END) AS Over39Sek FROM t1 WHERE dato1 between dato2;
Ovenstående forespørgsel laver en COUNT af rækkerne, som opfylder kriterierne i CASE elementet. Den summerer enten 0 eller 1, afhængig af, om kriterierne er opfyldt. På den måde kan man tælle antallet af rækker som opfylder kriteriet (f.eks. at sekunder er under 10).
SELECT Hour AS Klokke, SUM(CASE WHEN Sekunder < 10 THEN 1 else 0 END) AS Under10Sek, SUM(CASE WHEN Sekunder < 10 THEN 0 WHEN < 40 THEN 1 ELSE 0 END) AS Mellem10og39Sek, SUM(CASE WHEN Sekunder < 40 THEN 0 ELSE 1 END) AS Over39Sek FROM t1 WHERE dato1 between dato2 GROUP BY Hour;
Endnu en lille fejl rettet (havde glemt at referere feltnavnet Sekunder i CASE):
SELECT Hour AS Klokke, SUM(CASE WHEN Sekunder < 10 THEN 1 else 0 END) AS Under10Sek, SUM(CASE WHEN Sekunder < 10 THEN 0 WHEN Sekunder < 40 THEN 1 ELSE 0 END) AS Mellem10og39Sek, SUM(CASE WHEN Sekunder < 40 THEN 0 ELSE 1 END) AS Over39Sek FROM t1 WHERE dato1 between dato2 GROUP BY Hour;
Alternativt kunne jeg have brugt den anden måde at skrive CASE sætningen:
SELECT Hour AS Klokke, SUM(CASE Sekunder WHEN < 10 THEN 1 else 0 END) AS Under10Sek, SUM(CASE Sekunder WHEN < 10 THEN 0 WHEN < 40 THEN 1 ELSE 0 END) AS Mellem10og39Sek, SUM(CASE Sekunder WHEN < 40 THEN 0 ELSE 1 END) AS Over39Sek FROM t1 WHERE dato1 between dato2 GROUP BY Hour;
I den anden CASE sætning (den som skal tælle rækker mellem 10 og 39 sekunder), kunne jeg også have brugt denne måde:
SUM(CASE WHEN Sekunder BETWEEN 10 AND 39 THEN 1 ELSE 0 END)
Lav en tabel subtabel med kolonner code,val0,val1,val2:
0 1 NULL NULL 1 NULL 1 NULL 2 NULL NULL 1
og udfør query:
SELECT hour,COUNT(suptabel.val0) AS grp0,COUNT(suptabel.val1) AS grp1,COUNT(suptabel.val2) AS grp2 (SELECT hour,(sekunder+20)/30 AS code FROM tabel WHERE dato BETWEEN x AND y) x,suptabel WHERE x.code=suptabel.code
B)
SELECT hour,(sekunder+20)/30 AS code,COUNT(*) AS n FROM tabel WHERE dato BETWEEN x AND y GROUP BY hour,(sekunder+20)/30
og så lade app lave 3 rækker om til 1 række i præsentationen
Genialt kjulius, og det virker. Hvordan giver jeg dig poeng ?. I textboksen til venstre ved siden af Accepter står der terry, og det skal det vel ikke !! ?
Pigbear
NB: Kjulius, har du en ide til hvordan jeg regner gennemsnit ud på sekunderne, dvs. selve intervallet, så jeg kan oplyse hvad gennemsnits sekunderne er: fx (Mellem10og39Sek + Under10Sek + Over39Sek) /3 eller rettere antal case betingelser
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.