Avatar billede trp79 Nybegynder
15. september 2004 - 12:55 Der er 12 kommentarer og
1 løsning

Hjælp til query som lever op til Wadens 1. lov

Hejsa
Jeg har lavet følgende tabeller:
CREATE TABLE EMP (  ename VARCHAR(50) NOT NULL, salary INTEGER, deptnr INTEGER, PRIMARY KEY(ename));

CREATE TABLE DEPT (  deptnr INTEGER NOT NULL, deptname VARCHAR(50), PRIMARY KEY(deptnr));

og smidt nogle data i dem. Min opgave er så at finde ud af, om MySQL kan leve op til Wadens første lov som siger:
Does the system allow you to phrase, in a single expression, the query ”For each employee, show his or her name, salary, and average salary for his or her department”

Jeg kan godt få den til at finde gennemsnitlønnen for hver afdeling ved:
SELECT DEPTNR, AVG (SALARY) as AVESAL
FROM EMP
GROUP BY DEPTNR ;

og selvfølgelig også info om medarbejderne:
SELECT ENAME, SALARY
FROM EMP;

Men jeg kan ikke finde ud af at sammensætte disse to forespørgsler, så de overholder loven. Håber nogen kan hjælpe mig på vej :)

Mvh
Torben
Avatar billede trp79 Nybegynder
15. september 2004 - 13:01 #1
Det er selvfølgelig Warden´s test og ikke Wadens.. Det kommer fra "Adventures i relationland".
Avatar billede arne_v Ekspert
15. september 2004 - 13:11 #2
MySQL 3.x og 4.0 kan ikke lave subqueries og jeg tror at du har brug for en subquery
for at lave det i en query.
Avatar billede chries Nybegynder
15. september 2004 - 13:12 #3
Lille Gæt
SELECT ENAME, SALARY, AVG (SALARY) as AVESAL, DEPTNAME WHERE EMP.deptnr = DEPT.deptnr GRUOP BY EMP.ENAME, EMP.DEPTNR
Avatar billede chries Nybegynder
15. september 2004 - 13:14 #4
SELECT ENAME, SALARY, AVG (SALARY) as AVESAL, DEPTNAME FROM EMP, DEPT WHERE EMP.deptnr = DEPT.deptnr GROUP BY EMP.ENAME, EMP.DEPTNR
Avatar billede tbm_iceman Nybegynder
15. september 2004 - 13:15 #5
SELECT E.EName, E.DeptNr, E.Salary, (SELECT AVG(Salary) FROM Emp WHERE DeptNr = E.DeptNr) as AvgSal FROM Emp E ORDER BY EName
Avatar billede tbm_iceman Nybegynder
15. september 2004 - 13:20 #6
tror det er den eneste vej.
Avatar billede trp79 Nybegynder
15. september 2004 - 13:26 #7
--> tbm_iceman
Da dit forslag har en subquerie, så virker det desværre ikke, da jeg bruger MySQL 4.0 :(

--> chries
Dit forslag kommer ud med en arbejders gennemsnitløn(i stedet for afdelingens gennemsnitsløn), som er det samme som hans løn. Så det fungerer heller ikke :(

Noget tyder altså på at MySQL 4.0 ikke kan leve op til Wardens første lov. Og at arne derfor løber med pointene..
Avatar billede trp79 Nybegynder
15. september 2004 - 13:42 #8
Men Arne, nu hvor man ikke kan lave subqueries, hvad gør man så som alternativ?
Avatar billede arne_v Ekspert
15. september 2004 - 13:48 #9
I nogle tilfælde kan man fuske med noget JOIN.

I andre tilfælde må man bruge flere queries og flytte noget logik op fra
databasen til applikationen.
Avatar billede hrc Mester
15. september 2004 - 14:02 #10
Kan man ikke bare joine den anden tabel? Noget i retning af dette?

SELECT E.DEPTNR, AVG(E.SALARY) as AVESAL FROM EMP E
JOIN DEPT D ON (D.DEPTNR = E.DEPTNR)
GROUP BY DEPTNR
Avatar billede trp79 Nybegynder
15. september 2004 - 18:49 #11
-->hrc
Dit forslag giver kun afdelingsnr og gennemsnitløn for afdelingen:
DEPT  SALARY
1      100
2      100
3      300
og ikke:
Ename  DEPT  SALARY  AVGSALARYDEPT
Alfred  1      50      100
Britta  1      100      100
Carsten 1      150      100
Ditte  2      100      100
Erik    3      300      300

Arne dit svar holder stadig vand, så hvis du smider et svar, så er der points.

Tak for hjælpen til jer alle, mvh
Torben
Avatar billede arne_v Ekspert
15. september 2004 - 18:50 #12
svar
Avatar billede trp79 Nybegynder
15. september 2004 - 18:50 #13
Jøsses, hvor den fuckede space-formateringen op! Kan man ikke bruge tab på nogen måde her?
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