Avatar billede livse99 Nybegynder
20. juli 2005 - 13:47 Der er 13 kommentarer og
1 løsning

Undgå union all?

Hej

Jeg laver statistik for en 10 års periode, og har hidtil lavet den vha Union all. Men er der en nemmere måde at gøre det på, så jeg ikke behøver at gentage koden 10 gange fr at få optællingen sorteret på år? Problemet er at året står i en streng der består af klokkeslet, dato og år. Jeg skal have optalt antal fejlrapporter der lever op til kriterierne, fordelt på år.

Her er et exempel på den kode jeg bruger nu:

SELECT    '1996' Aar, 'Antal i alt' Tekst, Count(F.Fejlrapportnr)
FROM    Fejlrapport F, Objekttilstand O
WHERE    F.Fejlrapportnr = O.Fejlrapportnr
AND    egenskabsnr=27 and opslagsnr =11
AND     F.datotid CONTAINING '%1996%'        /*  i perioden 1996  */
AND    F.Fejlrapportnr IN
(SELECT    Fejlrapportnr From Objekttilstand
WHERE     Egenskabsnr = 35 and Opslagsnr = 1)    
AND    fejltype NOT IN (303,304,309,310)

UNION ALL

SELECT    '1997' Aar, 'Antal i alt Tekst, Count(F.Fejlrapportnr)
FROM    Fejlrapport F, Objekttilstand O
WHERE    F.Fejlrapportnr = O.Fejlrapportnr
AND    egenskabsnr=27 and opslagsnr =11
AND     F.datotid CONTAINING '%1997%'        /*  i perioden 1997  */
AND    F.Fejlrapportnr IN
(SELECT    Fejlrapportnr From Objekttilstand
WHERE     Egenskabsnr = 35 and Opslagsnr = 1)    
AND    fejltype NOT IN (303,304,309,310)

Union all, og så videre derudad. Jg håber meget at der er nogen der kan hjælpe!!!
Avatar billede arne_v Ekspert
20. juli 2005 - 13:53 #1
kan det ikke klares med en GROUP BY ?
Avatar billede livse99 Nybegynder
20. juli 2005 - 13:55 #2
Jeg har fedtet med det og er nåt frem til følgende, men kan stadig ikke løse mit primære problem: at få en sortering pr år.. Med nedenstående kode lægger den blot værdierne for de to år sammen.

SELECT    Count(distinct F.Fejlrapportnr)
FROM    fejlrapport f, objekttilstand o
WHERE    f.fejlrapportnr = o.fejlrapportnr
AND            fejltype IN(303,304)
AND          f.fejlrapportnr IN
                    (SELECT fejlrapportnr
                      FROM  fejlrapport
                      WHERE datotid containing '1996'
OR datotid containing '1997')
AND    f.fejlrapportnr IN
                    (SELECT    fejlrapportnr
                      FROM    objekttilstand
                      WHERE    egenskabsnr = 35 and Opslagsnr = 1)
Avatar billede livse99 Nybegynder
20. juli 2005 - 13:57 #3
Jeg tror det ikke.. Kan man det når datoen i virkeligheden står i en streng '10-12-1997 03.11.01' ?  Hvordan skal jeg gøre det?
Avatar billede livse99 Nybegynder
20. juli 2005 - 14:01 #4
Jeg har prøvet at lave en group by på datotid, men det dur ikke, den tæller ikke sammen da alle datotid er forskellige. Kan man lave et nummer med at hive årene ovr i en anden tabel eller sådan noget?
Avatar billede arne_v Ekspert
20. juli 2005 - 14:02 #5
kan du ikke lave den GROUP BY på en substring af dato feltet som indeholder året ?
Avatar billede livse99 Nybegynder
20. juli 2005 - 14:07 #6
Jeg kan ikke bruge substring, får fejlmeddelelse. Jeg burde vel kunne noget ala:

Select substring(datotid,7,10)
From fejlrapport

Men jeg får en "general SQL error, token unknown-line 1, char 25  , "
Avatar billede livse99 Nybegynder
20. juli 2005 - 15:21 #7
Har fundet ud af hvordan substring skal bruges i min db:

Select substring(datotid from 7 for 4)
From fejlrapport

Men nyt problemer opstået, da mit output bliver

1978
-199
1978
-197
1978
-197

Der er ikke blank foran nogen af datoerne, og alle datoer har samme format ('dag-måned-år time.minut.sekund', alle felter er udfyldt, evt med 0)
Avatar billede livse99 Nybegynder
20. juli 2005 - 15:35 #8
Jeg har fundet ud af at selvom formatet på datoen er nydeligt i db, så ændres det når jeg laver substring. Herefter bliver formatet:

18-nov-2004 19:48
1-aug-2004 8:46

Hvilket jo fuldstændig ødelægger min optælling..

Er der virkelig ikke nogen der kan hjælpe mig??
Avatar billede livse99 Nybegynder
20. juli 2005 - 15:37 #9
Kan man noget ala

Select year(datotid)
from fejlrapport

?
Avatar billede livse99 Nybegynder
20. juli 2005 - 15:47 #10
Følgende kode:

Select fejlrapportnr,datotid, substring (datotid from 1for 18)
From fejlrapport
where fejlrapportnr in(29541,29543)

Giver følgende output:

FEJLRAPPORTNR    DATOTID      SUBSTRING
       
29541            18-11-2004 19:48  18-NOV-2004  19:48:00
29543            01-08-2004 08:46  1-AUG-2004  8:46:00
Avatar billede arne_v Ekspert
20. juli 2005 - 15:50 #11
Prøv med:

EXTRACT(YEAR FROM datoid)
Avatar billede arne_v Ekspert
20. juli 2005 - 15:52 #12
eventuelt:

EXTRACT(YEAR FROM TIMESTAMP datoid)
Avatar billede arne_v Ekspert
20. juli 2005 - 15:53 #13
og se om ikke du får året ud
Avatar billede livse99 Nybegynder
21. juli 2005 - 09:02 #14
Tak - det virker :-)
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