2016-05-19 10 views
0

私は、タスクのプロジェクトとグループ化によって成功することなく最新の終了日(ProjectsTasksEndDate)を取得しようとしています。 BellowはSQLFiddleです。助言がありますか?グループを使用してMAX()

PS:コメントされた選択は、私が到達しようとしている選択を構築するためのベースでした。

SQL Fiddle

MS SQL Server 2008のスキーマのセットアップ:1

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'); 

問合せ:

/* 
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

私はオリジナルのポストを更新しました。この場合、私は最新のタスクの終了日を探しているので、私は1行しか見ていません。あなたのtmeありがとう。 – Khrys

+0

@Khrys最新の更新を参照してください – lad2025

+0

これは単なる例です。実際のケースでは、TOP 1を使用することはできません。なぜなら、1つではなく、他のプロジェクトが存在するからです。 – Khrys

関連する問題