/ 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
hvad gør forskellige DB systemer med
Fra : Kim Schulz


Dato : 07-04-05 08:55

Hejsa
Hvad forventes (SQL92 primært) at der sker med en query som denne:

SELECT AVG(price), name FROM pricelist

og hvad gør forskellige DBMS rent faktisk?

Jeg sidder med et lille database system og jeg tror ikke helt at den
gør som det er meningen.




--
Kim Schulz | Linux - Your Choice! Your Opinion! Your life!
Geek by nature |
schulz.dk |

 
 
Troels Arvin (07-04-2005)
Kommentar
Fra : Troels Arvin


Dato : 07-04-05 09:20

On Thu, 07 Apr 2005 09:55:27 +0200, Kim Schulz wrote:

> Hvad forventes (SQL92 primært) at der sker med en query som denne:
>
> SELECT AVG(price), name FROM pricelist
>
> og hvad gør forskellige DBMS rent faktisk?

Jeg tror ikke, at SQL-standarden er ændret siden SQL-92 vedr. dette.

Tænker du på NULL-håndtering eller datatyper?

Mht. NULL-håndtering: Rækker med NULL i pågældende kolonne ignoreres,
når der udregnes gennemsnit. Således kan du indsætte lige så mange
NULLs, du måtte ønske - det ændrer ikke på gennemsnittet. Dette synes
at være fuldstændig konsistent mellem de alm. udbredte DBMSer.

Der er lidt divergens mellem DBMSerne mht. datatype. Hvis du fx. tager
gennemsnit af en INTEGER-kolonne, vil nogle DBMSer (fx. MSSQL, tror jeg)
give dig et svar af INTEGER-typen, med mindre du CAST'er kolonnen til en
passende ikke-heltalstype; andre DBMSer (fx. Oracle og PostgreSQL) vil
give dig et decimaltal, hvis du fx beder om gennemsnittet af 1 og 2.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Troels Arvin (07-04-2005)
Kommentar
Fra : Troels Arvin


Dato : 07-04-05 09:32

On Thu, 07 Apr 2005 09:55:27 +0200, Kim Schulz wrote:

> SELECT AVG(price), name FROM pricelist

Der er i øvrigt to problemer i dit query:

For det første er NAME et reserveret ord, og det kan give bøvl. Jeg
plejer at bruge fullname for at undgå den slags.

For et andet, så er der kludder i din gruppering: Alle ikke-aggregerende
funktioner i din SELECT-liste skal være del af en GROUP BY liste. Tænk
over det: Du beder om en gennemsnitsværdi for tabellen, og så navnet,
der knytter sig til gennemsnitsværdien. Eftersom at gennemsnittet
omhandler mere end ét navn, vil det være umuligt at besvare dit
spørgsmål. Hvis du ønsker gennemsnitspriserne for dine varer, inddelt i
grupper med samme navn, kunne du bruge:
SELECT AVG(price), name FROM pricelist GROUP BY name

--
Greetings from Troels Arvin, Copenhagen, Denmark


Kim Schulz (07-04-2005)
Kommentar
Fra : Kim Schulz


Dato : 07-04-05 10:25

On Thu, 07 Apr 2005 10:32:18 +0200
Troels Arvin <troels@arvin.dk> wrote:

> On Thu, 07 Apr 2005 09:55:27 +0200, Kim Schulz wrote:
>
> > SELECT AVG(price), name FROM pricelist
>
> Der er i øvrigt to problemer i dit query:
>
> For det første er NAME et reserveret ord, og det kan give bøvl. Jeg
> plejer at bruge fullname for at undgå den slags.

Sorry! tænkt eksempel, så brug du bare fullname i stedet for


> For et andet, så er der kludder i din gruppering: Alle ikke-
> aggregerende funktioner i din SELECT-liste skal være del af en GROUP
> BY liste. Tænk over det: Du beder om en gennemsnitsværdi for
> tabellen, og så navnet, der knytter sig til gennemsnitsværdien.
> Eftersom at gennemsnittet omhandler mere end ét navn, vil det være
> umuligt at besvare dit spørgsmål. Hvis du ønsker gennemsnitspriserne
> for dine varer, inddelt i grupper med samme navn, kunne du bruge:
> SELECT AVG(price), name FROM pricelist GROUP BY name

Se det var netop dette jeg ville frem til! hvad der rent faktisk sker
ved denne "fejl" i forskellige systemer. Fejler de på query eller?
I det system jeg sidder med smider den avg af price og så første
name. jeg erindrer også at have set andre systemer smide en kolonne
med alle navnene og så en med samme værdi (avg værdien) i alle celler i
en anden kolonne.

altså
AVG(price) | fullname
4 | ting1
4 | ting2
...





--
Kim Schulz | Need a Content Management System for your website? Go
Geek by nature | get Fundanemt at : http://www.fundanemt.com New
schulz.dk | version out now!

Troels Arvin (07-04-2005)
Kommentar
Fra : Troels Arvin


Dato : 07-04-05 11:01

On Thu, 07 Apr 2005 11:24:53 +0200, Kim Schulz wrote:

>> For et andet, så er der kludder i din gruppering: Alle ikke-
>> aggregerende funktioner i din SELECT-liste skal være del af en GROUP BY
>> liste.
[...]

> Se det var netop dette jeg ville frem til! hvad der rent faktisk sker ved
> denne "fejl" i forskellige systemer. Fejler de på query eller?

Det vil jeg mene. Selv MySQL - der ellers har et lettere alternativt
approach til aspekter af GROUP BY - nægter, hvis du ikke har en GROUP BY
med i forespørgslen.

> I det
> system jeg sidder med smider den avg af price og så første name.

Hvad er det for et system?

--
Greetings from Troels Arvin, Copenhagen, Denmark


Kim Schulz (07-04-2005)
Kommentar
Fra : Kim Schulz


Dato : 07-04-05 11:25

On Thu, 07 Apr 2005 12:01:21 +0200
Troels Arvin <troels@arvin.dk> wrote:

> On Thu, 07 Apr 2005 11:24:53 +0200, Kim Schulz wrote:
>
> >> For et andet, så er der kludder i din gruppering: Alle ikke-
> >> aggregerende funktioner i din SELECT-liste skal være del af en
> >> GROUP BY liste.
> [...]
>
> > Se det var netop dette jeg ville frem til! hvad der rent faktisk
> > sker ved denne "fejl" i forskellige systemer. Fejler de på query
> > eller?
>
> Det vil jeg mene. Selv MySQL - der ellers har et lettere alternativt
> approach til aspekter af GROUP BY - nægter, hvis du ikke har en GROUP
> BY med i forespørgslen.
>
> > I det
> > system jeg sidder med smider den avg af price og så første name.
>
> Hvad er det for et system?
>

Det er McKoi(.com) men jeg har fundet fejlen i deres kode. Der var en
lille overflow fejl som gjorde at den valgte første element. Nu skulle
den gerne gøre som de fleste og jeg fik et grundlag for min mistanke om
at den gjorde det forkert.


--
Kim Schulz | Keen of Fundanemt? Want to share experieces with
Geek by nature | other users? join The Fundanemt User Group NOW!
schulz.dk | http://www.fundausers.org

Stig H. Jacobsen (07-04-2005)
Kommentar
Fra : Stig H. Jacobsen


Dato : 07-04-05 15:36

On Thu, 7 Apr 2005 09:55:27 +0200, Kim Schulz wrote:

> SELECT AVG(price), name FROM pricelist
> og hvad gør forskellige DBMS rent faktisk?

PostgreSQL 8:

ERROR: column "pricelist.fullname" must appear in the GROUP BY
clause or be used in an aggregate function

> Jeg sidder med et lille database system og jeg tror ikke helt at den
> gør som det er meningen.

Der er fejl i SQL'en, så den skal komme med en fejl, hvis den
da mener at kunne snakke SQL.

--
Stig

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

Månedens bedste
Årets bedste
Sidste års bedste