Reputation: 87
I am trying to query Parts that have not moved in my system for more than 90 days. I am starting to run into a many-to-many issue, and I am very new to SQL.
It needs to work like:
Meets all criteria, post result in query.
DECLARE @now DATETIME
DECLARE @90daysago DATETIME
SET @now = GETDATE()
SET @90daysago = DATEADD(day, -90, @now)
SELECT
o.PartNo,
o.JobNo,
o.Status,
cast(po.DateEnt as DATE) AS DateEnt,
tt.TicketDate,
(o.qtyToMake - o.QtyShipped2Stock) AS NumOpen
FROM
OrderDet AS o
INNER JOIN PODet AS pod
ON o.PartNo = pod.PartNo
INNER JOIN PO as po
ON pod.PONum = po.PONum
INNER JOIN TimeTicketDet as tt
ON o.JobNo = tt.JobNo
WHERE
o.Status = 'Open' AND
o.PartNo = '72347' AND
o.JobNo = '16516-02'
ORDER BY
po.DateEnt DESC
The above link shows a piece of the executed query, I am running it on a mock PartNo.
The first columns are PartNo, JobNo respectively.
The two dates are DateEnt, TicketDate respectively.
As you can see, every single change in our system duplicates the data and shows all of the dates. When I add the criteria >@90daysago then it will show a DateEnt from 12-19-2016 which is a closed Order. I know this is incredibly vague, I just do not know how to show only the most recent values for each date for the query. I will be glad to provide any more useful information.
Sample Data
+--------+-------+--------+------------+------------+
| PartNo | JobNo | Status | DateEnt | TicketDate |
+--------+-------+--------+------------+------------+
| 72347 | 1 | OPEN | 12/19/2016 | 10/6/2016 |
| 72347 | 2 | OPEN | 12/19/2016 | 10/5/2016 |
| 72347 | 3 | OPEN | 12/19/2016 | 12/23/2016 |
| 72347 | 4 | OPEN | 12/19/2016 | 12/23/2016 |
| 72347 | 1 | OPEN | 12/19/2016 | 10/6/2016 |
| 72347 | 2 | OPEN | 3/30/2017 | 10/5/2016 |
| 72347 | 3 | OPEN | 3/30/2017 | 12/23/2016 |
| 72347 | 4 | OPEN | 3/30/2017 | 12/23/2016 |
| 72347 | 1 | OPEN | 3/30/2017 | 10/6/2016 |
| 72347 | 200 | OPEN | 1/9/2017 | 10/5/2016 |
| 72347 | 3 | OPEN | 3/30/2017 | 12/23/2016 |
| 72347 | 4 | OPEN | 3/30/2017 | 12/26/2016 |
| 72347 | 1 | OPEN | 3/30/2017 | 10/6/2016 |
| 72347 | 2 | OPEN | 3/30/2017 | 10/5/2016 |
| 72347 | 3 | OPEN | 3/30/2017 | 12/23/2016 |
| 72347 | 4 | OPEN | 3/30/2017 | 12/23/2016 |
+--------+-------+--------+------------+------------+
Sample Result
+--------+-------+--------+----------+------------+--+
| PartNo | JobNo | Status | DateEnt | TicketDate | |
+--------+-------+--------+----------+------------+--+
| 72347 | 200 | OPEN | 1/9/2017 | 10/5/2017 | |
+--------+-------+--------+----------+------------+--+
Upvotes: 0
Views: 82
Reputation: 660
Please try this. You can adjust PARTITION BY and ORDER BY to meet your requirement.
;WITH cte AS(SELECT o.PartNo
, o.JobNo
, o.Status
, CAST(po.DateEnt as DATE) AS DateEnt
, tt.TicketDate
, (o.qtyToMake - o.QtyShipped2Stock) AS NumOpen
, ROW_NUMBER() OVER(PARTITION BY o.PartNo ORDER BY po.DateEnt DESC, tt.TicketDate DESC) AS Rownum
FROM OrderDet AS o
INNER JOIN PODet AS pod
ON o.PartNo = pod.PartNo
INNER JOIN PO AS po
ON pod.PONum = po.PONum
INNER JOIN TimeTicketDet AS tt
ON o.JobNo = tt.JobNo
WHERE o.Status = 'Open'
AND po.DateEnt < CONVERT(VARCHAR(10), DATEADD(DAY, -90, GETDATE()), 120)
)
SELECT *
FROM cte
WHERE Rownum = 1
AND TicketDate < CONVERT(VARCHAR(10), DATEADD(DAY, -90, GETDATE()), 120);
Upvotes: 1