/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Problemer med Aggregat-funktion
Fra : Steen Andreassen


Dato : 04-08-04 22:24

Hejsa....

Så er den gal igen.

Jeg har denne tabel:
CREATE TABLE [dbo].[tbl_enheder_idrift] (
[enhedsID] [smallint] NOT NULL ,
[AutoInsByNeType] [smallint] NULL ,
[dato] [datetime] NOT NULL ,
[antal] [smallint] NOT NULL
)

Med eks. disse data:
1,1,12-5-2004,4
1,1,13-5-2004,2
2,17,12-5-2004,1
2,17,13-5-2004,3
1,17,25-5-2004,5
1,2,28-6-2004,8
15,7,22-5-2004,100

Når denne SQL-sætning køres:
SET @enhedsid = 1 /* Skal erstattes med overført var. i en funktion */
SET @aarstal = 2004 /* Skal erstattes med overført var. i en funktion */

SELECT enhedsid, AutoinsByNeType, AVG(antal) AS AvgAntal
FROM tbl_enheder_idrift
WHERE AutoInsByNeType IS NOT NULL
AND datepart(YEAR, dato) = @aarstal
AND enhedsid = @enhedsid
GROUP BY enhedsid, AutoinsByNeType

Fås dette output, som er gennemsnittet på grupperne, hvilket er helt ok:
1,1,3
1,2,8
1,17,5

Men jeg har behov for en sum af den sidste kolonne, som i ovenstående giver
16.

Hvordan får jeg flettet det ind i min SQL-sætning ?

MVH
Steen



 
 
Kristian Damm Jensen (05-08-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 05-08-04 07:44

"Steen Andreassen" <sandr@k.dk> wrote in message news:<4111540b$0$279$edfadb0f@dread16.news.tele.dk>...
> Hejsa....
>
> Så er den gal igen.
>
> Jeg har denne tabel:
> CREATE TABLE [dbo].[tbl_enheder_idrift] (
> [enhedsID] [smallint] NOT NULL ,
> [AutoInsByNeType] [smallint] NULL ,
> [dato] [datetime] NOT NULL ,
> [antal] [smallint] NOT NULL
> )
>
> Med eks. disse data:
> 1,1,12-5-2004,4
> 1,1,13-5-2004,2
> 2,17,12-5-2004,1
> 2,17,13-5-2004,3
> 1,17,25-5-2004,5
> 1,2,28-6-2004,8
> 15,7,22-5-2004,100
>
> Når denne SQL-sætning køres:
> SET @enhedsid = 1 /* Skal erstattes med overført var. i en funktion */
> SET @aarstal = 2004 /* Skal erstattes med overført var. i en funktion */
>
> SELECT enhedsid, AutoinsByNeType, AVG(antal) AS AvgAntal
> FROM tbl_enheder_idrift
> WHERE AutoInsByNeType IS NOT NULL
> AND datepart(YEAR, dato) = @aarstal
> AND enhedsid = @enhedsid
> GROUP BY enhedsid, AutoinsByNeType
>
> Fås dette output, som er gennemsnittet på grupperne, hvilket er helt ok:
> 1,1,3
> 1,2,8
> 1,17,5
>
> Men jeg har behov for en sum af den sidste kolonne, som i ovenstående giver
> 16.
>
> Hvordan får jeg flettet det ind i min SQL-sætning ?

Det gør du ikke.

Hvad, mere præcis, er du ønsker output skal være?
1,1,3,16
1,2,8,16
1,17,5,16
??

Men så har du jo reelt beregnet summen tre gange!


Du kan muligivis skrive (jeg garanterer hverken for at nedenstående
overholder ANSI eller kan køre på noget kendt DBMS)

SELECT enhedsid
, AutoinsByNeType
, AVG(antal) AS AvgAntal
, select sum((SELECT enhedsId, AVG(antal) AS AvgAntal
FROM tbl_enheder_idrift
WHERE AutoInsByNeType IS NOT NULL
AND datepart(YEAR, dato) = @aarstal
AND enhedsid = @enhedsid
GROUP BY enhedsid, AutoinsByNeType)) as AvgSum
FROM tbl_enheder_idrift ei
WHERE AutoInsByNeType IS NOT NULL
AND datepart(YEAR, dato) = @aarstal
AND enhedsid = @enhedsid
GROUP BY enhedsid, AutoinsByNeType

Men det kamouflerer jo bare det faktum, at du er nødt til at beregne
summen af gennemsnittene i en særskilt select.

VH
Kristian

steen (05-08-2004)
Kommentar
Fra : steen


Dato : 05-08-04 08:39

>> "Hvad, mere præcis, er du ønsker output skal være?" <<

Jeg ønsker bare en smallinteger værdi, som i nedenstående er værdien 16, som
indikerer at der er 16 stk printkort af typen #1, som er placeret i 3
forskellige udstyrstyper.

Selve udregningen kommer til at ligge i en user-defined-funktion, som bliver
udført vha. autocomputed column i den tabel der indeholder oversigten over
alle unikke printkort.

Jeg skal prøve at forklare problemet.

En given type printkort, kan sidde i forskellige type udstyr. Selvom det er
samme slags kort, har firmaet registreret kortet med forskellige navne
(numre) alt afhængig hvor det sidder.
Enhedsid er selve korttypen. Næste kolonne i tabellen er i hvilket
udstyrstype kortene sidder i.

Der vil blive hentet data fra disse registreringssystemer en gang om
måneden, og jeg har behov for at gemme alle disse data, således at vi kan
beregne bla. fejlstaatistik på kortene.

Jeg har derfor behov for at finde det gennemsnitlige antal kort af en given
slags der sidder i en bestemt type udstyr, hvorefter jeg har brug for en sum
af alle kort af samme slags.

Kan mit problem evt. løses ved at lave en temporær tabel og putte
nedenstående udtræk over i, og derefter bare tage en SUM på den sidste
kolonne fra denne memory-baserede temporære tabel?

Eller har du en bedre ide ?

MVH
Steen
"Kristian Damm Jensen" <damm@ofir.dk> skrev i en meddelelse
news:2c9e2992.0408042244.d3aa94e@posting.google.com...
> "Steen Andreassen" <sandr@k.dk> wrote in message
news:<4111540b$0$279$edfadb0f@dread16.news.tele.dk>...
> > Hejsa....
> >
> > Så er den gal igen.
> >
> > Jeg har denne tabel:
> > CREATE TABLE [dbo].[tbl_enheder_idrift] (
> > [enhedsID] [smallint] NOT NULL ,
> > [AutoInsByNeType] [smallint] NULL ,
> > [dato] [datetime] NOT NULL ,
> > [antal] [smallint] NOT NULL
> > )
> >
> > Med eks. disse data:
> > 1,1,12-5-2004,4
> > 1,1,13-5-2004,2
> > 2,17,12-5-2004,1
> > 2,17,13-5-2004,3
> > 1,17,25-5-2004,5
> > 1,2,28-6-2004,8
> > 15,7,22-5-2004,100
> >
> > Når denne SQL-sætning køres:
> > SET @enhedsid = 1 /* Skal erstattes med overført var. i en funktion */
> > SET @aarstal = 2004 /* Skal erstattes med overført var. i en funktion */
> >
> > SELECT enhedsid, AutoinsByNeType, AVG(antal) AS AvgAntal
> > FROM tbl_enheder_idrift
> > WHERE AutoInsByNeType IS NOT NULL
> > AND datepart(YEAR, dato) = @aarstal
> > AND enhedsid = @enhedsid
> > GROUP BY enhedsid, AutoinsByNeType
> >
> > Fås dette output, som er gennemsnittet på grupperne, hvilket er helt ok:
> > 1,1,3
> > 1,2,8
> > 1,17,5
> >
> > Men jeg har behov for en sum af den sidste kolonne, som i ovenstående
giver
> > 16.
> >
> > Hvordan får jeg flettet det ind i min SQL-sætning ?
>
> Det gør du ikke.
>
> Hvad, mere præcis, er du ønsker output skal være?
> 1,1,3,16
> 1,2,8,16
> 1,17,5,16
> ??
>
> Men så har du jo reelt beregnet summen tre gange!
>
>
> Du kan muligivis skrive (jeg garanterer hverken for at nedenstående
> overholder ANSI eller kan køre på noget kendt DBMS)
>
> SELECT enhedsid
> , AutoinsByNeType
> , AVG(antal) AS AvgAntal
> , select sum((SELECT enhedsId, AVG(antal) AS AvgAntal
> FROM tbl_enheder_idrift
> WHERE AutoInsByNeType IS NOT NULL
> AND datepart(YEAR, dato) = @aarstal
> AND enhedsid = @enhedsid
> GROUP BY enhedsid, AutoinsByNeType)) as AvgSum
> FROM tbl_enheder_idrift ei
> WHERE AutoInsByNeType IS NOT NULL
> AND datepart(YEAR, dato) = @aarstal
> AND enhedsid = @enhedsid
> GROUP BY enhedsid, AutoinsByNeType
>
> Men det kamouflerer jo bare det faktum, at du er nødt til at beregne
> summen af gennemsnittene i en særskilt select.
>
> VH
> Kristian



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste