|
| Re: Problemer med Aggregat-funktion Fra : Kristian Damm Jensen |
Dato : 05-08-04 12:01 |
|
steen wrote:
> >> "Hvad, mere præcis, er du ønsker output skal være?" <<
Du har tilsyneladende ikke forstået mit spørgsmål. Jeg er klar over,
at du vil have tallet 16 ud. Men præcis hvordan vil du have det til at
stå i den *tabel* der er resultatet af din select?
Pointen er, at tallet 16 ikke har nogen relation til de enkelte
rækker, men til alle rækker på én gang.
<snip>
> 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?
Det lyder da fornuftigt.
VH Kristian
| |
Steen Andreassen (05-08-2004)
| Kommentar Fra : Steen Andreassen |
Dato : 05-08-04 12:23 |
|
Hej igen....
Jeg har egentlig ikke noget at bruge den tabel til, som jeg får ud i min
SQL-sætning.
Jeg har kun brug for summen af de beregnede gennemsnitlige værdier som
bliver beregnet pr. udstyrstype.
Min formel er det tætteste jeg, med min viden, er kommet det ønskede output.
Håber det var nok forklaring, ellers må du lige spørge igen.
MVH
Steen
"Kristian Damm Jensen" <damm@ofir.dk> skrev i en meddelelse
news:cet422$43f@odak26.prod.google.com...
steen wrote:
> >> "Hvad, mere præcis, er du ønsker output skal være?" <<
Du har tilsyneladende ikke forstået mit spørgsmål. Jeg er klar over,
at du vil have tallet 16 ud. Men præcis hvordan vil du have det til at
stå i den *tabel* der er resultatet af din select?
Pointen er, at tallet 16 ikke har nogen relation til de enkelte
rækker, men til alle rækker på én gang.
<snip>
> 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?
Det lyder da fornuftigt.
VH Kristian
| |
Kristian Damm Jensen (05-08-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 05-08-04 20:26 |
|
"Steen Andreassen" <steen@ff.dk> wrote in message news:<411218ad$0$229$edfadb0f@dread14.news.tele.dk>...
> Hej igen....
>
> Jeg har egentlig ikke noget at bruge den tabel til, som jeg får ud i min
> SQL-sætning.
> Jeg har kun brug for summen af de beregnede gennemsnitlige værdier som
> bliver beregnet pr. udstyrstype.
Se det forsimpler jo sagen noget.
> Min formel er det tætteste jeg, med min viden, er kommet det ønskede output.
>
> Håber det var nok forklaring, ellers må du lige spørge igen.
Jeg prøver dit, jeg prøver dat. Views tillader ikke parametre, hm.
subselect er ikke tilladt med group by, hm.
HA! Så enkelt kan det gøres:
SELECT sum(AVG(antal)) AS AvgAntal
FROM kdje_test
WHERE AutoInsByNeType IS NOT NULL
AND datepart(YEAR, dato) = @aarstal
AND enhedsid = @enhedsid
GROUP BY enhedsid, AutoinsByNeType
Eller for nu at give hele scriptet, der er testen på Sybase SQLServer
12:
drop table kdje_test
go
create table kdje_test(
enhedsID smallint NOT NULL ,
AutoInsByNeType smallint NULL ,
dato datetime NOT NULL ,
antal smallint NOT NULL)
go
insert into kdje_test values( 1, 1, '2004-5-12',4)
insert into kdje_test values( 1, 1, '2004-5-13',2)
insert into kdje_test values( 2,17, '2004-5-12',1)
insert into kdje_test values( 2,17, '2004-5-13',3)
insert into kdje_test values( 1,17, '2004-5-25',5)
insert into kdje_test values( 1, 2, '2004-6-28',8)
insert into kdje_test values(15, 7, '2004-5-22',100)
go
select * from kdje_test
go
declare @aarstal int, @enhedsid int
select @aarstal = 2004, @enhedsid = 1
SELECT sum(AVG(antal)) AS AvgAntal
FROM kdje_test
WHERE AutoInsByNeType IS NOT NULL
AND datepart(YEAR, dato) = @aarstal
AND enhedsid = @enhedsid
GROUP BY enhedsid, AutoinsByNeType
go
drop table kdje_test
go
Var det godt nok?
(Det var i al fald en udfordring, der var morsom nok til at den var
værd at bruge ½ time på.)
VH
Kristian
| |
Peter Lykkegaard (05-08-2004)
| Kommentar Fra : Peter Lykkegaard |
Dato : 05-08-04 20:44 |
|
"Kristian Damm Jensen" wrote
> HA! Så enkelt kan det gøres:
> SELECT sum(AVG(antal)) AS AvgAntal
> FROM ....
Tjohh hvorfor ikke ;.)
> ... der er testen på Sybase SQLServer
Det ser ud til at være gangbart på MSSQL
- Peter
| |
Steen Andreassen (05-08-2004)
| Kommentar Fra : Steen Andreassen |
Dato : 05-08-04 21:40 |
|
Hej igen.....
Det er rart at se, at dette også kan volde "Eksperterne" problemer.
Jeg ved ikke om i har prøvet det, men når man har siddet med sådan et
problem i så lang tid, så roder det rundt i hovedet på en, også når man
forsøger at sove.
Jeg havde derfor lige håbet på en rolig nats søvn, MEN!!!
Når jeg udfører Kristians "Enkle" SQL-sætningen på MSSQL-2000 er outputtet
dette:
"Server: Msg 130, Level 15, State 1, Line 7
Cannot perform an aggregate function on an expression containing an
aggregate or a subquery."
Er vi derhenne hvor der skal anvendes en temporær tabel til outputtet af den
oprindelige sætning, og derefter kan man selecte summen fra den sidste
kolonni i den temporære tabel ?
MVH
Steen
"Kristian Damm Jensen" <damm@ofir.dk> wrote in message
news:2c9e2992.0408051125.79d6bbed@posting.google.com...
> "Steen Andreassen" <steen@ff.dk> wrote in message
news:<411218ad$0$229$edfadb0f@dread14.news.tele.dk>...
> > Hej igen....
> >
> > Jeg har egentlig ikke noget at bruge den tabel til, som jeg får ud i min
> > SQL-sætning.
> > Jeg har kun brug for summen af de beregnede gennemsnitlige værdier som
> > bliver beregnet pr. udstyrstype.
>
> Se det forsimpler jo sagen noget.
>
> > Min formel er det tætteste jeg, med min viden, er kommet det ønskede
output.
> >
> > Håber det var nok forklaring, ellers må du lige spørge igen.
>
> Jeg prøver dit, jeg prøver dat. Views tillader ikke parametre, hm.
> subselect er ikke tilladt med group by, hm.
>
> HA! Så enkelt kan det gøres:
> SELECT sum(AVG(antal)) AS AvgAntal
> FROM kdje_test
> WHERE AutoInsByNeType IS NOT NULL
> AND datepart(YEAR, dato) = @aarstal
> AND enhedsid = @enhedsid
> GROUP BY enhedsid, AutoinsByNeType
>
> Eller for nu at give hele scriptet, der er testen på Sybase SQLServer
> 12:
>
> drop table kdje_test
> go
>
> create table kdje_test(
> enhedsID smallint NOT NULL ,
> AutoInsByNeType smallint NULL ,
> dato datetime NOT NULL ,
> antal smallint NOT NULL)
>
> go
>
> insert into kdje_test values( 1, 1, '2004-5-12',4)
> insert into kdje_test values( 1, 1, '2004-5-13',2)
> insert into kdje_test values( 2,17, '2004-5-12',1)
> insert into kdje_test values( 2,17, '2004-5-13',3)
> insert into kdje_test values( 1,17, '2004-5-25',5)
> insert into kdje_test values( 1, 2, '2004-6-28',8)
> insert into kdje_test values(15, 7, '2004-5-22',100)
> go
>
> select * from kdje_test
>
> go
> declare @aarstal int, @enhedsid int
> select @aarstal = 2004, @enhedsid = 1
>
> SELECT sum(AVG(antal)) AS AvgAntal
> FROM kdje_test
> WHERE AutoInsByNeType IS NOT NULL
> AND datepart(YEAR, dato) = @aarstal
> AND enhedsid = @enhedsid
> GROUP BY enhedsid, AutoinsByNeType
>
> go
>
> drop table kdje_test
> go
>
> Var det godt nok?
>
> (Det var i al fald en udfordring, der var morsom nok til at den var
> værd at bruge ½ time på.)
>
> VH
> Kristian
| |
Peter Lykkegaard (05-08-2004)
| Kommentar Fra : Peter Lykkegaard |
Dato : 05-08-04 22:22 |
|
"Steen Andreassen" wrote
>
> "Server: Msg 130, Level 15, State 1, Line 7
> Cannot perform an aggregate function on an expression containing an
> aggregate or a subquery."
>
> Er vi derhenne hvor der skal anvendes en temporær tabel til outputtet
af den
> oprindelige sætning, og derefter kan man selecte summen fra den sidste
> kolonni i den temporære tabel ?
>
Njahh den her giver 16 (MSSQL 2K)
Select sum(AvgAntal) as SummaSummarum FROM (SELECT AVG(antal) AS
AvgAntal
FROM kdje_test
WHERE AutoInsByNeType IS NOT NULL
AND datepart(YEAR, dato) = @aarstal
AND enhedsid = @enhedsid
GROUP BY enhedsid, AutoinsByNeType) AS Avg
- Peter
| |
Steen Andreassen (06-08-2004)
| Kommentar Fra : Steen Andreassen |
Dato : 06-08-04 06:53 |
|
Hejsa Peter......
SET @TakTilPeter = (SELECT '100000 * tak')
Du har sikkert ikke brugt en brøkdel af den tid jeg har gjort, men uden dit
input var det blevet lavet med en temporær tabel her i formiddag.
Men kunne jeg ikke få dig til at forklare de sidste 2 ord "AS Avg".
Hvorfor skal de være der, udover det ikke virker uden ?
Det ser ud til at SQL-Queryanalyseren opfatter dette sidste "Avg" som
funktionen Avg.
Hvad er det man navngiver "Avg" ?
Mvh
Steen
"Peter Lykkegaard" <polonline@hotmail.com> skrev i en meddelelse
news:4112a533$0$272$edfadb0f@dread14.news.tele.dk...
> "Steen Andreassen" wrote
>
> >
> > "Server: Msg 130, Level 15, State 1, Line 7
> > Cannot perform an aggregate function on an expression containing an
> > aggregate or a subquery."
> >
> > Er vi derhenne hvor der skal anvendes en temporær tabel til outputtet
> af den
> > oprindelige sætning, og derefter kan man selecte summen fra den sidste
> > kolonni i den temporære tabel ?
> >
> Njahh den her giver 16 (MSSQL 2K)
>
> Select sum(AvgAntal) as SummaSummarum FROM (SELECT AVG(antal) AS
> AvgAntal
> FROM kdje_test
> WHERE AutoInsByNeType IS NOT NULL
> AND datepart(YEAR, dato) = @aarstal
> AND enhedsid = @enhedsid
> GROUP BY enhedsid, AutoinsByNeType) AS Avg
>
> - Peter
>
>
| |
Peter Lykkegaard (06-08-2004)
| Kommentar Fra : Peter Lykkegaard |
Dato : 06-08-04 08:28 |
|
"Steen Andreassen" wrote
> Men kunne jeg ikke få dig til at forklare de sidste 2 ord "AS Avg".
> Hvorfor skal de være der, udover det ikke virker uden ?
Den forkromede forklaring har jeg ikke, det kan være BOL kan give den
(eller Kristian
Men "As Avg" er blot en navngivning af resultatsættet du laver din
summering på
Jeg kunne også have kaldt den: MyTempResult eller andet
> Det ser ud til at SQL-Queryanalyseren opfatter dette sidste "Avg" som
> funktionen Avg.
> Hvad er det man navngiver "Avg" ?
>
Det er det resultatsæt man får på den inderste select
Jeg skulle nok have været lidt mere pædagoisk
- Peter
| |
Kristian Damm Jensen (06-08-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 06-08-04 11:22 |
|
"Steen Andreassen" <sandr@k.dk> wrote in message news:<41131cb7$0$312$edfadb0f@dread16.news.tele.dk>...
> Hejsa Peter......
>
> SET @TakTilPeter = (SELECT '100000 * tak')
>
> Du har sikkert ikke brugt en brøkdel af den tid jeg har gjort, men uden dit
> input var det blevet lavet med en temporær tabel her i formiddag.
>
> Men kunne jeg ikke få dig til at forklare de sidste 2 ord "AS Avg".
> Hvorfor skal de være der, udover det ikke virker uden ?
> Det ser ud til at SQL-Queryanalyseren opfatter dette sidste "Avg" som
> funktionen Avg.
For håbentlig ikke da. Så giver det slet ingen mening. Det er i sig
selv forbløffende at det er tilladt at benytte et funktionsnavn som
tabelalias
> Hvad er det man navngiver "Avg" ?
Resultatet af den subselect, der står i parenteres udmiddelbart inden.
VH
Kristian
| |
Peter Lykkegaard (06-08-2004)
| Kommentar Fra : Peter Lykkegaard |
Dato : 06-08-04 11:41 |
|
"Kristian Damm Jensen" wrote
> "Steen Andreassen" wrote
> > Det ser ud til at SQL-Queryanalyseren opfatter dette sidste "Avg"
som
> > funktionen Avg.
>
> For håbentlig ikke da. Så giver det slet ingen mening.
Det gør den faktisk
Dvs det er "intellisense" i QA der giver udtrykket en anden farve
> Det er i sig selv forbløffende at det er tilladt at benytte
> et funktionsnavn som tabelalias
Det er der ingen problemer i
For at gøre forvirringen komplet, så kan man faktisk lave det her tricks
Select Sum(Avg) As Sum FROM (SELECT AVG(antal) As Avg
FROM kdje_test
WHERE AutoInsByNeType IS NOT NULL
AND datepart(YEAR, dato) = @aarstal
AND enhedsid = @enhedsid
GROUP BY enhedsid, AutoinsByNeType) As Avg
Det er fordi MSSQL kun vil kendes ved funktioner når de efterfølges af
start/slut parenteser
Der er så en bug i QA (imho)
Ex:
------------------------------------------------------
select getdate as Somedate
Go
select getdate() as Somedate
Go
------------------------------------------------------
Server: Msg 207, Level 16, State 3, Line 1
Invalid column name 'getdate'.
Somedate
------------------------------------------------------
2004-08-06 12:38:22.300
(1 row(s) affected)
- Peter
| |
Kristian Damm Jensen (06-08-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 06-08-04 08:31 |
|
"Peter Lykkegaard" <polonline@hotmail.com> wrote in message news:<4112a533$0$272$edfadb0f@dread14.news.tele.dk>...
> "Steen Andreassen" wrote
>
> >
> > "Server: Msg 130, Level 15, State 1, Line 7
> > Cannot perform an aggregate function on an expression containing an
> > aggregate or a subquery."
> >
> > Er vi derhenne hvor der skal anvendes en temporær tabel til outputtet
> af den
> > oprindelige sætning, og derefter kan man selecte summen fra den sidste
> > kolonni i den temporære tabel ?
> >
> Njahh den her giver 16 (MSSQL 2K)
>
> Select sum(AvgAntal) as SummaSummarum FROM (SELECT AVG(antal) AS
> AvgAntal
> FROM kdje_test
> WHERE AutoInsByNeType IS NOT NULL
> AND datepart(YEAR, dato) = @aarstal
> AND enhedsid = @enhedsid
> GROUP BY enhedsid, AutoinsByNeType) AS Avg
Morsomt.
Den havde jeg også på tegnebrættet (det var faktisk min første tanke,
idet den netop implementerer en temporær tabel, som bliver smidt væk,
så snart man har fundet summen - man lader bare serveren gøre det
kedelige arbejde), men Sybase nægtede at acceptere group by i en
sub-select.
VH
Kristian
| |
Steen Andreassen (06-08-2004)
| Kommentar Fra : Steen Andreassen |
Dato : 06-08-04 13:24 |
|
Jeg takker mange gange for hjælpen.
Og så har jeg forøvrigt omdøbt den sidste "Avg" i den version der nu ligger
på min server, således at jeg ikke behøver undres igen senere.
Men hvis nu den sidste "AS Avg" er en temporær tabel, hvorfor skal den så
ikke navngives med et Hash-tegn (#) foran ?
Det skal den nemlig i al den SQL-litteratur jeg har til rådighed på min
bogreol, og i BOL.
MVH
Steen
"Kristian Damm Jensen" <damm@ofir.dk> skrev i en meddelelse
news:2c9e2992.0408052330.184f2cf2@posting.google.com...
> "Peter Lykkegaard" <polonline@hotmail.com> wrote in message
news:<4112a533$0$272$edfadb0f@dread14.news.tele.dk>...
> > "Steen Andreassen" wrote
> >
> > >
> > > "Server: Msg 130, Level 15, State 1, Line 7
> > > Cannot perform an aggregate function on an expression containing an
> > > aggregate or a subquery."
> > >
> > > Er vi derhenne hvor der skal anvendes en temporær tabel til outputtet
> > af den
> > > oprindelige sætning, og derefter kan man selecte summen fra den sidste
> > > kolonni i den temporære tabel ?
> > >
> > Njahh den her giver 16 (MSSQL 2K)
> >
> > Select sum(AvgAntal) as SummaSummarum FROM (SELECT AVG(antal) AS
> > AvgAntal
> > FROM kdje_test
> > WHERE AutoInsByNeType IS NOT NULL
> > AND datepart(YEAR, dato) = @aarstal
> > AND enhedsid = @enhedsid
> > GROUP BY enhedsid, AutoinsByNeType) AS Avg
>
> Morsomt.
>
> Den havde jeg også på tegnebrættet (det var faktisk min første tanke,
> idet den netop implementerer en temporær tabel, som bliver smidt væk,
> så snart man har fundet summen - man lader bare serveren gøre det
> kedelige arbejde), men Sybase nægtede at acceptere group by i en
> sub-select.
>
> VH
> Kristian
| |
Kristian Damm Jensen (09-08-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 09-08-04 12:05 |
|
"Steen Andreassen" <sandr@k.dk> wrote in message news:<41137863$0$218$edfadb0f@dread14.news.tele.dk>...
> Jeg takker mange gange for hjælpen.
>
> Og så har jeg forøvrigt omdøbt den sidste "Avg" i den version der nu ligger
> på min server, således at jeg ikke behøver undres igen senere.
>
> Men hvis nu den sidste "AS Avg" er en temporær tabel, hvorfor skal den så
> ikke navngives med et Hash-tegn (#) foran ?
Fordi den er virtuel. Der er tale om et stykke mellemregning som
databasen laver, i modsætning til de mellemregninger du selv laver.
VH
Kristian
| |
|
|