Avatar billede pigbear Nybegynder
20. november 2008 - 16:49 Der er 12 kommentarer

Select inde i en select

Hej med jer,

Er det muligt at skrive en select sætning inde i en anden select sætning?(og jeg mener ikke en indlejret sætning)

Min select sætning ser sådan ud:

SELECT    Hour AS Klokke,
Count (side) as 'antal'
FROM        t1
WHERE    dato1 between dato2;

Det jeg vil er at erstatte count(wait) sætningen med min egen select sætning fx således:

SELECT    Hour AS Klokke,(Select(Sekunder from t1 where sekunder <= 10) AS minesekunder)
FROM        t1
WHERE    dato1 between dato2;

mvh

Pigbear
Avatar billede pigbear Nybegynder
20. november 2008 - 16:51 #1
ups, om igen:
Hej med jer,

Er det muligt at skrive en select sætning inde i en anden select sætning?(og jeg mener ikke en indlejret sætning)

Min select sætning ser sådan ud:

SELECT    Hour AS Klokke,
Count (side) as antal
FROM        t1
WHERE    dato1 between dato2;

Det jeg vil er at erstatte "count(side) as antal" sætningen med min egen select sætning fx således:

SELECT    Hour AS Klokke,(Select(Sekunder from t1 where sekunder <= 10) AS minesekunder)
FROM        t1
WHERE    dato1 between dato2;

mvh

Pigbear
Avatar billede terry Ekspert
20. november 2008 - 18:20 #2
First, the sub select syntax is wrong.


SELECT    Hour AS Klokke,(Select count(Sekunder) from t1 where sekunder <= 10) AS minesekunder)

and as you can see in the example the sub select must return one row.
Avatar billede terry Ekspert
20. november 2008 - 18:21 #3
I used Select count(Sekunder) ... as an example, you could use for example Sum(Sekunder) as long as you only retun one row
Avatar billede kjulius Novice
21. november 2008 - 00:34 #4
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.
Avatar billede terry Ekspert
21. november 2008 - 08:21 #5
thanks for point that out kjulis, my eyes arent what they have been :o)
Avatar billede terry Ekspert
21. november 2008 - 08:21 #6
kjulis = kjulius
Avatar billede pigbear Nybegynder
21. november 2008 - 11:20 #7
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

mvh
pigbear
Avatar billede kjulius Novice
22. november 2008 - 12:50 #8
Du kan lave en pivotering med en case struktur:

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).
Avatar billede kjulius Novice
22. november 2008 - 12:53 #9
Der manglede lige en GROUP BY:

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;
Avatar billede kjulius Novice
22. november 2008 - 13:02 #10
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)

Mange veje fører som bekendt til Rom...
Avatar billede arne_v Ekspert
23. november 2008 - 04:54 #11
Et par mere eksotiske ideer:

A)

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
Avatar billede pigbear Nybegynder
24. november 2008 - 11:14 #12
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester