2012-01-20 11 views
2

Я дам 2 примера, первый один, который работает, а 2-ой, что я хочу сделать:дата SQL MAX с ГДЕ В пункте

SELECT P.ProjName, D.update_date, SUM(E.pass), SUM(E.fail) 
    FROM execution AS E INNER JOIN ( 
    daily AS D INNER JOIN project AS P ON D.project_ID = P.ID) 
    ON E.daily_ID = D.ID 
    WHERE D.project_id = 25 AND D.update_date = ( 
    SELECT MAX(update_date) FROM daily WHERE project_id = 25;) 
    GROUP BY P.ProjName, D.update_date; 

Это будет работать для отдельных проектов. Это дает мне общее количество пропусков и сбоев за последний день данного проекта (здесь, 25). Я хотел бы захватить группу проектов, используя предложение WHERE IN. Например, (но не работает):

SELECT P.ProjName, D.update_date, SUM(E.pass), SUM(E.fail) 
    FROM execution AS E INNER JOIN ( 
    daily AS D INNER JOIN project AS P ON D.project_ID = P.ID) 
    ON E.daily_ID = D.ID 
    WHERE D.project_id IN (25,26,28,29,30,31) 
    GROUP BY P.ProjName, D.update_date 
    HAVING MAX(D.update_date); 

Это приведет к тому, что каждый день будет тянут за каждый из проектов. Существует 3 таблицы, «проект», который связан «ежедневно», который связан «исполнением». Таким образом, для каждого проекта существует несколько ежедневных данных, и каждый день имеет несколько данных выполнения. Я понимаю, что HAVING MAX, вероятно, нуждается в сравнении, но к чему? Возможно, измененный JOIN поможет.

Спасибо, Keith

+0

Вы используете MSSQL? –

+0

Это MS Access DB с использованием разъема ADODB (Jet 4) из Excel VBA. Первый ответ, решил. Спасибо за помощь каждого. – dropper

+0

Еще одно примечание. Мне нужно было добавить P.ID к операторам SELECT и GROUP BY, чтобы сохранить исходный порядок. – dropper

ответ

7

Это немного сложнее, пытаясь сделать это, не зная, базы данных, но попробуйте это:

SELECT P.ProjName, D.update_date, SUM(E.pass), SUM(E.fail) 
    FROM execution AS E INNER JOIN ( 
    daily AS D INNER JOIN project AS P ON D.project_ID = P.ID) 
    ON E.daily_ID = D.ID 
    WHERE D.project_id IN (25,26,28,29,30,31) AND D.update_date = ( 
    SELECT MAX(update_date) FROM daily WHERE project_id = D.project_id) 
    GROUP BY P.ProjName, D.update_date; 

Я действительно понятия не имею, если это близко к чему вы хотите.

+0

Это сработало отлично. Благодаря! – dropper

+0

Ничего себе на самом деле? Ха-ха!Это здорово, удачи :) –

0

Вы не указали конкретную СУБД, так как об этом (непроверенных) SQL кода, который должен по большей части быть СУБД агностиком:

SELECT P.ProjName, 
     DesiredProjectUpdateDate.MaxUpdateDate, 
     SELECT SUM(pass) AS PassSum 
     FROM execution 
     WHERE daily_ID=D.ID, 
     SELECT SUM(fail) AS FailSum 
     FROM execution 
     WHERE daily_ID=D.ID 
FROM 
(-- This derived table helps you get the correct records from the daily table 
    SELECT D.project_ID, MAX(D.Update_date) AS MaxUpdateDate 
    FROM daily AS D 
    GROUP BY D.project_ID 
    WHERE D.project_ID IN (25,26,28,29,30,31) 
) As DesiredProjectUpdateDate 
JOIN daily AS D 
    ON D.project_ID=DesiredProjectUpdateDate.project_ID AND 
    D.Update_date=DesiredProjectUpdateDate.MaxUpdateDate 
JOIN project AS P 
    ON P.ID = DesiredProjectUpdateDate.ProjectId 

Дайте что выстрелил и дайте мне знать, если у вас возникнут другие проблемы.

0

Проблема в том, что вам нужен выбор, который возвращает максимальное значение update_date для каждого проекта.

Попробуйте это:

SELECT P.ProjName, D.update_date, SUM(E.pass), SUM(E.fail) 
    FROM execution AS E INNER JOIN ( 
    daily AS D INNER JOIN project AS P ON D.project_ID = P.ID) 
    ON E.daily_ID = D.ID 
    WHERE D.project_id IN (25,26,28,29,30,31) 
    AND D.update_date > ALL 
    (SELECT update_date FROM 
    daily AS D2 
    WHERE D.ID=D2.ID -- I am assuming that daily.ID is the primary key 
    AND ISNULL(D.update_date, '9999 DEC 31') <> D2.update_date) 
    GROUP BY P.ProjName, D.update_date; 

Я довольно часто писать запросы, как это и они быстрее, чем при использовании агрегатной функции MAX и работать хорошо.

EDIT: Извините, я забыл удалить вашу теперь избыточную линию HAVING MAX.... Виноват!

+0

Вы попробовали это? –

+0

Да, но это дает мне ошибку: «Неверное количество аргументов, используемых с функцией в выражении запроса». D.ID = D2.ID И ISNULL (D.update_date, '9999 DEC 31') <> D2.update_date '. " Возможно, Jet не любит ISNULL? Я пробовал это без ISNULL, и это давало мне каждую дату. – dropper

+0

Хммм. Я не слишком много знаю о Jet/Access, но я дал вам код T-SQL ... Спасибо, что сообщили мне, что это не сработало. –

Смежные вопросы