Avatar billede mortenag Nybegynder
05. april 2010 - 17:32 Der er 3 kommentarer

HJÆLP til Update Statement

Kan ikke finde ud af hvorfor følgende Update statement ikke virker..
Har prøvet følgende men det giver fejlen:

Invalid use of group function

UPDATE faculty AS f 
      SET f.salary = f.salary * 1.05
      WHERE COUNT(instructor) = (SELECT 
              COUNT(instructor)
            FROM courseoffering AS c, course AS co, faculty AS f
                          WHERE c.courseid = co.courseid
                            AND f.name = c.instructor
                            AND c.semester ='SPRING'
                          AND co.department = 'Computer Science'
                          GROUP BY instructor
                          HAVING COUNT(instructor) > 1)

Jeg skal opdatere en instruktørs løn med 5 %, hvis han er instruktør på mere end 1 kursus i forårs semestret og er tilhørende Computer Science departementet. Hjælp...

CREATE TABLE student (
  studentid INT (20) PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  class VARCHAR (50) NOT NULL,
  major VARCHAR(100)NOT NULL
) TYPE=InnoDB;

INSERT INTO student (studentid, name, class, major)
VALUES ('999872543','Joe Smith','Senior','Computer Science'),
      ('995389332','Jane Doe','Junior','Computer Science'),
      ('999872552','Bo Hansen','Junior','Computer Science'),
      ('991236459','Hans Ib','Senior','Computer Science'),
      ('991236460','Lise Hansen','Junior','E Business'),
      ('991236461','Karen Jeppesen','Senior','E Business'),
      ('991236462','Hans Sørensen','Senior','E Business'),
      ('991236463','Lasse Høeg','Junior','E Business'),
      ('991236464','IB BO Hansen','Senior','Computer Science'),
      ('991236465','Søs Larsen','Junior','Database Design'),
      ('991236466','Lars Larsen','Senior','Database Design'),
      ('991236467','Uffe Hansen','Junior','Database Design'),
      ('991236468','Stefan Sørensen','Senior','Database Design'),
      ('991236469','Christian Høeg','Senior','Communication'),
      ('991236470','Lulu Hansen','Senior','Communication'),
      ('991236471','Bo Hansen Larsen', 'Senior','Communication');

CREATE TABLE course (
  courseid VARCHAR (4) PRIMARY KEY,
  coursename VARCHAR (100),
  department VARCHAR (50)
) TYPE=InnoDB;

INSERT INTO course
VALUES ('ITDD', 'Introduction to Database Design','Computer Science'),
        ('DAMI', 'Data Mining','Computer Science'),
        ('ITPM', 'IT Project Management','E Business'),
        ('BUCA', 'Business Cases','E Business'),
        ('IP', 'Introductory Programming','Software Engineering'),
        ('OOP', 'Object Oriented Programming ','Software Engineering'),
        ('OS', 'Operating Systems','Communication'),
        ('PW', 'Project Workshop','Software Engineering');
       
CREATE TABLE courseoffering (
  courseid VARCHAR (4),
  semester VARCHAR(50),
  year VARCHAR (4),
  instructor VARCHAR (50),
  FOREIGN KEY (courseid) REFERENCES course(courseid)
  ON DELETE CASCADE
  ON UPDATE CASCADE
) TYPE=InnoDB;

INSERT INTO courseoffering
VALUES ('ITDD', 'Spring','2010','John Smithson'),
        ('DAMI', 'Spring','2010','James Jensen'),
        ('ITDD', 'Spring','2010','James Jensen'),
        ('ITPM', 'Fall','2010','Ole Isakson'),
        ('BUCA', 'Fall','2010','Lars Larsen'),
        ('IP', 'Spring','2010','Kurt Nielsen'),
        ('OOP', 'Spring','2010','Karl Smith'),
        ('OS', 'Spring','2010','Lars Hansen'),
        ('IP', 'Spring','2010','John Smithson');
       
CREATE TABLE faculty (
  name VARCHAR (50) PRIMARY KEY,
  office VARCHAR(50),
  salary VARCHAR(10)
) TYPE=InnoDB;

INSERT INTO faculty
VALUES ('John Smithson', '4D44','220000'),
        ('James Jensen', '4D45','250000'),
        ('Ole Isakson', '3D44','300000'),
        ('Lars Larsen', '4D100','300000'),
        ('Kurt Nielsen', '4C44','250000'),
        ('Karl Smith', '4B44','220000'),
        ('Lars Hansen', '4D30','250000');
       
CREATE TABLE gradereport (
  studentid INT (20),
  courseid VARCHAR (4),
  semester VARCHAR(50),
  year VARCHAR (4),
  grade INT (2),
  PRIMARY KEY (studentid, courseid)
) TYPE=InnoDB;

INSERT INTO gradereport
VALUES ('999872543','ITDD','Spring','2009','5'),
      ('995389332','ITDD','Fall','2008','12'),
      ('999872543','OS','Spring','2007','7'),
      ('999872543','PW','Fall','2008','10'),
      ('991236460','OS','Spring','2009','12'),
      ('991236460','PW','Spring','2009','12'),
      ('991236461','ITDD','Fall','2009','4'),
      ('991236462','OS','Spring','2007','7'),
      ('991236462','IP','Spring','2007','7'),
      ('991236463','ITDD','Spring','2009','7'),
      ('991236464','IP','Fall','2007','10'),
      ('991236464','DAMI','Fall','2007','10'),
      ('991236465','IP','Fall','2007','2'),
      ('991236466','BUCA','Fall','2009','7'),
      ('991236467','BUCA','Spring','2008','7'),
      ('991236467','OOP','Spring','2008','7'),
      ('991236468','OOP','Fall','2009','10'),
      ('991236469','OOP','Spring','2008','10'),
      ('991236470','ITPM','Fall','2007','12'),
      ('991236470','DAMI','Fall','2007','12'),
      ('991236471','DAMI', 'Spring','2009','12'),
      ('991236471','OS', 'Spring','2009','12');

CREATE TABLE prerequisite (
  courseid VARCHAR (4),
  prerequisiteid VARCHAR (4),
  PRIMARY KEY (prerequisiteid, courseid)
) TYPE=InnoDB;

INSERT INTO prerequisite
VALUES ('ITDD','OS'),
      ('OOP','PW'),
      ('DAMI','ITDD');
Avatar billede erikjacobsen Ekspert
05. april 2010 - 19:07 #1
Din første COUNT(instructor) er i hvert fald noget vrøvl, for der er ikke sådan et felt i faculty-tabellen. Hvad med (utestet)


UPDATE faculty AS f
      SET f.salary = f.salary * 1.05
      WHERE name IN (SELECT
              c.instructor
            FROM courseoffering AS c, course AS co, faculty AS f
                          WHERE c.courseid = co.courseid
                            AND f.name = c.instructor
                            AND c.semester ='SPRING'
                          AND co.department = 'Computer Science'
                          GROUP BY instructor
                          HAVING COUNT(*) > 1)
Avatar billede erikjacobsen Ekspert
05. april 2010 - 19:19 #2
Hmm, du behøver jo ikke have faculty med i din sub-select:

UPDATE faculty AS f
      SET f.salary = f.salary * 1.05
      WHERE name IN (SELECT
              c.instructor
            FROM courseoffering AS c, course AS co
                          WHERE c.courseid = co.courseid
                            AND c.semester ='SPRING'
                          AND co.department = 'Computer Science'
                          GROUP BY instructor
                          HAVING COUNT(*) > 1)
Avatar billede mortenag Nybegynder
08. april 2010 - 23:41 #3
Tak for hjælpen Erik...
Kan dog ikke helt forstå hvorfor det skal være name( Where name IN..) Den indgår jo ikke i subquerien..

Morten
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