2016-05-19 4 views
0

Я пытаюсь получить последнюю дату окончания (ProjectsTasksEndDate) из проекта и группы задачи без успеха. Ниже перечислены SQLFiddle. Какие-либо предложения?Группа с использованием MAX()

PS .: Прокомментированный выбор был базой для построения выбора, к которому я пытаюсь добраться.

SQL Fiddle

сервера Настройка MS SQL 2008 схемы:

CREATE TABLE Projects 
(
    id int identity primary key, 
    ProjectID varchar(20), 
    ProjectStartDate date, 
    ProjectEndDate date 
); 

CREATE TABLE ProjectsTasks 
(
    id int identity primary key, 
    ProjectID varchar(20), 
    ProjectsTasksStartDate date, 
    ProjectsTasksEndDate date 
); 

INSERT INTO Projects 
(ProjectID, ProjectStartDate, ProjectEndDate) 
VALUES 
('1', '2015-01-05', '2015-04-08'), 
('2', '2015-01-06', '2015-07-20'), 
('3', '2015-02-05', '2015-07-22'), 
('4', '2015-03-05', '2015-08-08'), 
('5', '2015-03-05', '2015-09-18'), 
('6', '2015-04-05', '2015-10-02'), 
('7', '2016-07-05', '2016-11-20'); 

INSERT INTO ProjectsTasks 
(ProjectID, ProjectsTasksStartDate, ProjectsTasksEndDate) 
VALUES 
('1', '2015-01-05', '2015-01-10'), 
('1', '2015-01-06', '2015-02-20'), 
('1', '2015-02-05', '2015-03-20'), 
('1', '2015-03-01', '2015-03-02'), 
('1', '2015-01-05', '2015-04-08'), 
('2', '2015-06-01', '2015-06-20'), 
('3', '2015-12-20', '2015-12-21'); 

Запрос 1:

/* 
SELECT 
    YEAR (Projects.ProjectEndDate) AS [Year], 
    MONTH (Projects.ProjectEndDate) AS [Month], 
    COUNT (*) AS [Total] 
FROM 
    Projects 
GROUP BY 
    YEAR (Projects.ProjectEndDate), 
    MONTH (Projects.ProjectEndDate) 
*/ 


SELECT 
    YEAR (MAX(ProjectsTasks.ProjectsTasksEndDate)) AS [Year], 
    MONTH (MAX(ProjectsTasks.ProjectsTasksEndDate)) AS [Month], 
    COUNT (*) AS [Total] 
FROM Projects 
RIGHT JOIN ProjectsTasks 
    ON Projects.ProjectID = ProjectsTasks.ProjectID 
GROUP BY YEAR (ProjectsTasks.ProjectsTasksEndDate), 
      MONTH (ProjectsTasks.ProjectsTasksEndDate) 

[Ожидаемые результаты]:

| Year | Month | Total | 
|------|-------|-------| 
| 2015 |  4 |  1 | 
| 2015 |  6 |  1 | 
| 2015 | 12 |  1 | 

ответ

0

Если я правильно понял ваш intetion правильно, вы можете использовать:

SELECT TOP 1 
    [Year] = YEAR(ProjectsTasks.ProjectsTasksEndDate) 
    ,[Month] = MONTH(ProjectsTasks.ProjectsTasksEndDate) 
    ,[Total] = COUNT (*) 
FROM Projects 
RIGHT JOIN ProjectsTasks 
    ON Projects.ProjectID = ProjectsTasks.ProjectID 
GROUP BY YEAR(ProjectsTasks.ProjectsTasksEndDate), 
     MONTH(ProjectsTasks.ProjectsTasksEndDate) 
ORDER BY Year DESC, Month DESC 

LiveDemo

EDIT:

SELECT TOP 1 WITH TIES [Year],[Month],[Total] 
FROM (
    SELECT ProjectsTasks.ProjectID 
    ,[Year] = YEAR(MAX(ProjectsTasks.ProjectsTasksEndDate)) 
    ,[Month] = MONTH(MAX(ProjectsTasks.ProjectsTasksEndDate)) 
    ,[Total] = COUNT (*) 
    FROM Projects 
    RIGHT JOIN ProjectsTasks 
    ON Projects.ProjectID = ProjectsTasks.ProjectID 
    GROUP BY ProjectsTasks.ProjectID, 
      YEAR(ProjectsTasks.ProjectsTasksEndDate), 
      MONTH(ProjectsTasks.ProjectsTasksEndDate) 
) s 
ORDER BY ROW_NUMBER() OVER(PARTITION BY ProjectID 
          ORDER BY [Year] DESC, [Month] DESC); 

LiveDemo 2

Выход:

╔══════╦═══════╦═══════╗ 
║ Year ║ Month ║ Total ║ 
╠══════╬═══════╬═══════╣ 
║ 2015 ║  4 ║  1 ║ 
║ 2015 ║  6 ║  1 ║ 
║ 2015 ║ 12 ║  1 ║ 
╚══════╩═══════╩═══════╝ 
+0

Я только что обновил оригинальный пост. В этом случае я наблюдаю только одну строку, потому что я ищу самую последнюю дату окончания задачи. Спасибо за твой. – Khrys

+0

@Khrys См. Обновленный – lad2025

+0

Ну, это был всего лишь пример. В реальном случае я не могу использовать TOP 1, потому что будут другие проекты, а не только один. – Khrys

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