SELECT *
FROM tasks
LEFT JOIN plans
ON plans.task_id = tasks.id
WHERE plan.week IS NULL OR (plan.week < DATEPART(week, GetDate()) AND plan.Year = YEAR(GETDATE())
を使用しないSELECT *
でください。必要な各列を明示的に書き出してください。年列もあるかどうかは言及していませんが、週番号と年を処理する必要があります。# 週だけを処理すると、複数の年にわたって結果が得られます。
タスクの説明だけを使用できるようですね??? タスクの説明を使用できるのに、なぜ週の列に基づいているのですか?
SELECT *
FROM tasks
LEFT JOIN plans
ON plans.task_id = tasks.id
WHERE tasks.description = 'Past' OR tasks.description = 'Not planned'
ああ、私はあなたのデータを理解しました。複数のタスクを持つことができますが、週番号は異なります。これは簡単です。クエリを使用して MAX(Week#) GROUP BY タスクを検索し、クエリを実行します。
CREATE TABLE #MyTest
(
TaskID int,
TaskYear int,
TaskWeek int
)
INSERT INTO #MyTest(TaskID,TaskYear,TaskWeek)
VALUES (1, 2012, 4)
INSERT INTO #MyTest(TaskID,TaskYear,TaskWeek)
VALUES (2, 2012, 5)
INSERT INTO #MyTest(TaskID,TaskYear,TaskWeek)
VALUES (2, 2012, 36)
INSERT INTO #MyTest(TaskID,TaskYear,TaskWeek)
VALUES (3, 2012, 36)
INSERT INTO #MyTest(TaskID,TaskYear,TaskWeek)
VALUES (4, 2012, NULL)
INSERT INTO #MyTest(TaskID,TaskYear,TaskWeek)
VALUES (6, 2011, 5)
INSERT INTO #MyTest(TaskID,TaskYear,TaskWeek)
VALUES (6, 2010, 36)
SELECT
TaskID,
MAX(TaskWeek) AS WeekNumber,
TaskYear
FROM
#MyTest
GROUP BY
TaskID,
TaskWeek,
TaskYear
HAVING MAX(TaskWeek) < DatePart(week, GetDate()) OR MIN(TaskWeek) IS NULL
DROP TABLE #MyTest
これにより、それぞれtask.id
に最大の週番号を持つ一意の行が表示されます。
最終結果
あなたの最終的なコメントに基づいて:
これをコピーして sql management studio に貼り付けます。コメントを付けておきます。
CREATE TABLE #MyTest
(
TaskID int,
TaskDate datetime
)
--test for only in the past NOTHING in the future
INSERT INTO #MyTest(TaskID, TaskDate)
VALUES (1, '1998-01-01')
--test for planned in the future NOTHING in the past
INSERT INTO #MyTest(TaskID,TaskDate)
VALUES (3, '2012-12-24')
--test for no plan as all (IS NULL)
INSERT INTO #MyTest(TaskID,TaskDate)
VALUES (4, null)
--test for planned in the past but has an upcoming event in the future
INSERT INTO #MyTest(TaskID,TaskDate)
VALUES (6, '2011-12-23')
INSERT INTO #MyTest(TaskID,TaskDate)
VALUES (6, '2012-12-23')
INSERT INTO #MyTest(TaskID,TaskDate)
--test for planned in the past, NO upcoming event in the future
VALUES (8, '2012-1-23')
INSERT INTO #MyTest(TaskID,TaskDate)
VALUES (8, '2012-6-23')
--result should show:
-- task id = 1 (because of: performed in past but nothing in the future)
-- task id = 4 (because of: no plan at all)
-- task id = 8 (because of: only past)
SELECT
TaskID,
YEAR(TaskDate) AS TheYear,
DatePart(week, TaskDate) AS WeekNumber
FROM
#MyTest
WHERE
--handle no planning of a task...
((TaskDate IS NULL)
--eliminate any task id that is out in the future
OR TaskID NOT IN (SELECT TaskID FROM #MyTest WHERE TaskDate > GetDate()))
GROUP BY
TaskID,
Year(TaskDate),
DatePart(week, TaskDate)
DROP TABLE #MyTest