2013-12-14 5 views
0

Здравствуйте, я застрял в одном запросе SQL для моего задания и надеялся на какую-то помощь.Сложный запрос SQL Count

Мне нужно, чтобы получить идентификатор проекта для лучших выполненного проекта -The проекта, где (VERY_GOOD количества записей + ХОРОШО количество записей) - (VERY_BAD количество записей + BAD количество записей) является наибольшим

Моей схема и тестовые записи в базе данных (HSQLDB)

CREATE TABLE 
    PROJECT 
    (
     ID IDENTITY NOT NULL PRIMARY KEY, 
     PROJECT_NAME VARCHAR(255) NOT NULL 
    ); 

CREATE TABLE 
    RECORD 
    (
     ID IDENTITY NOT NULL PRIMARY KEY, 
     RESULT VARCHAR(255) NOT NULL, 
    ); 

CREATE TABLE 
    RECORD_PROJECT 
    (
     PROJECT_ID INTEGER NOT NULL, 
     RECORD_ID INTEGER NOT NULL, 
     PRIMARY KEY(PROJECT_ID, RECORD_ID), 
     FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(ID) ON DELETE CASCADE, 
     FOREIGN KEY (RECORD_ID) REFERENCES RECORD(ID) 
    ); 

и тестовые данные:

INSERT INTO PROJECT (PROJECT_NAME) VALUES ('Bake a cake'); 
INSERT INTO PROJECT (PROJECT_NAME) VALUES ('Clean the house'); 

INSERT INTO RECORD (RESULT) VALUES ('GOOD'); 
INSERT INTO RECORD (RESULT) VALUES ('VERY_GOOD'); 
INSERT INTO RECORD (RESULT) VALUES ('VERY_GOOD'); 
INSERT INTO RECORD (RESULT) VALUES ('BAD'); 
INSERT INTO RECORD (RESULT) VALUES ('VERY_BAD'); 

INSERT INTO RECORD_PROJECT (PROJECT_ID, RECORD_ID) VALUES (0,0); 
INSERT INTO RECORD_PROJECT (PROJECT_ID, RECORD_ID) VALUES (1,1); 
INSERT INTO RECORD_PROJECT (PROJECT_ID, RECORD_ID) VALUES (1,2); 
INSERT INTO RECORD_PROJECT (PROJECT_ID, RECORD_ID) VALUES (0,3); 
INSERT INTO RECORD_PROJECT (PROJECT_ID, RECORD_ID) VALUES (1,4); 

(я удалил неродственного FIEL ds из таблиц)

Итак, у меня есть 3 хорошие записи и 2 плохой, мне нужно будет получить проект с самым высоким рейтингом, который в соответствии с этим сейчас будет Очистите дом с 3 хороших рейтинга более чем 2 негатива для другого проекта.

Возможно, кто-то это понял бы, спасибо!

+0

Вы должны использовать символ для record.result? –

+0

IDENTITY? Это ново для меня – Strawberry

+0

Запись - это твердое значение в базе данных, которое я также мог бы решить с помощью перечисления. Для результата мне просто нужен идентификатор проекта, который имеет лучшие результаты. – Vaelyr

ответ

0

Это должно быть (не testet) SQL в MySQL-Диалект:

SELECT rp.PROJECT_ID, p.PROJECT_NAME 
    SUM(CASE WHEN rp.RECORD_ID < 3 THEN 1 ELSE 0 END) AS rating 
FROM RECORD_PROJEKT AS rp 
JOIN PROJECT AS p ON p.ID = rp.PROJECT_ID 
GROUP BY rp.PROJECT_ID 
ORDER BY rating DESC 
+0

Извините, я не понимаю, как это помогает мне. Кажется, неправильный синтаксис для hsql. – Vaelyr

+0

@Vaelyr. , , Вопрос помечен как «mysql», а не «hsql». –

+0

Я думаю, что это должно работать на HSQLDB, если вы не включили p.PROJECT_NAME. ВЫБОР rp.PROJECT_ID, СУММА (случай, когда rp.RECORD_ID <3 ТОГДА 1 0 КОНЕЦ ИНАЧЕ) КАК рейтинг ОТ RECORD_PROJECT КАК Р.П. РЕГИСТРИРУЙТЕСЬ проект как р = О p.ID rp.PROJECT_ID GROUP BY rp.PROJECT_ID ORDER BY рейтинг DESC – fredt