[英]How do I get all records where date is 6 months greater than today's date, using Microsoft SQL Server 2008?
[英]return all records where the completed date is greater than a previous record's next due date?
好的,由于数据库的设计不佳,因此感觉像是一个复杂的查询,但是可惜-它确实存在并且需要解决。 该表有5个字段:id(PK),itemNumber(FK),completedDate,completedBy(FK),nextDue。
在应用程序中,当某人记录一项已完成的任务时,它将填写completedDate,计算下一个到期日并将其放入nextDue。
我需要的是一个查询,该查询基本上将查看记录的nextDue日期,然后向前查看具有相同itemNumber的下一条记录,并将其与completedDate进行比较; 然后,如果completedDate超过completedBy日期,则返回该行。 那有意义吗? 能做到吗? 听起来好像必须相对于纯sql在程序上完成。 TIA
UDPATE:我想我应该更具体一些。 我需要在报表中使用此查询,因此,如果需要在VBA中完成此查询,则不确定如何获取结果。
我发现思考这些怪异查询的最佳方法是将它们分解为较小的可管理查询。 因此,我认为这是首先关联然后比较两个记录:“当前”记录和“下一个”记录。 我们要做的第一件事是将每个记录(将成为“当前”)与其对应的“下一个”记录相关联。
因此,首先,获取所有记录ID及其对应的“下一条记录”的查询。 这将在JOIN语句中使用小于号<<来获取当前记录之后的所有记录。
SELECT
T.id as currentId,
MIN(A.id) as nextId
FROM
rec_completionDate as T
JOIN
rec_completionDate as A ON T.itemNumber = A.itemNumber and T.id < A.id
GROUP BY
T.id
接下来是一个查询,该查询使用以上作为子查询,返回每个记录(当前和下一条)的所有适当字段:
SELECT
current.*,
next.*
FROM
( ... [subquery goes here] ...) sq
JOIN
rec_completionDate as current ON sq.currentId = current.id
JOIN
rec_completionDate as next ON sq.nextId = next.id
最后,我们要使用以下WHERE子句来限制最后一个查询的结果:
WHERE
next.completedDate > current.nextDue
因此,将它们放在一起:
SELECT
current.*,
next.*
FROM
(
SELECT
T.id as currentId,
MIN(A.id) as nextId
FROM
rec_completionDate as T
JOIN
rec_completionDate as A ON T.itemNumber = A.itemNumber and T.id < A.id
GROUP BY
T.id
) sq
JOIN
rec_completionDate as current ON sq.currentId = current.id
JOIN
rec_completionDate as next ON sq.nextId = next.id
WHERE
next.completedDate > current.nextDue
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.