Reputation: 13
I am not able to determine how long an OBJNR has been in a particular status if there is no corresponding end date. The result is "0" due to the status still being active. I would like to use ongoing today's date to calculate how long an object number has been in that status. See current results below.
(
SELECT
JCDS_SOGR.OBJNR, JCDS_SOGR.STAT, TJ02T.TXT30, DATEDIFF(DAY,MIN(JCDS_SOGR.UDATE),MAX(JCDS_SOGR.UDATE))
AS DIF
FROM JCDS_SOGR
JOIN TJ02T ON JCDS_SOGR.STAT = TJ02T.ISTAT
WHERE JCDS_SOGR.OBJNR = 'IE000000000010003791'
AND TJ02T.SPRAS = 'E'
GROUP BY JCDS_SOGR.OBJNR,JCDS_SOGR.STAT,TJ02T.TXT30)
UNION ALL
(
SELECT JCDS_SOGR.OBJNR, JCDS_SOGR.STAT, TJ30T.TXT30, DATEDIFF(DAY,MIN(JCDS_SOGR.UDATE),MAX(JCDS_SOGR.UDATE))
AS DIF
FROM JCDS_SOGR
JOIN TJ30T ON JCDS_SOGR.STAT = TJ30T.ESTAT
WHERE JCDS_SOGR.OBJNR = 'IE000000000010003791'
AND TJ30T.SPRAS = 'E'
AND TJ30T.MANDT='400'
AND TJ30T.STSMA = 'VEHICLE'
GROUP BY JCDS_SOGR.OBJNR,JCDS_SOGR.STAT,TJ30T.TXT30)
Expected Results is Where there is no end date I can use today's date to calculate date diff formula. The results with "0" do not have a corresponding end date in that respective status.
Currently, This is the Result:
OBJNR STAT TXT30 DIF
1 3791 I1099 Available 0
2 3791 E0002 Awaiting Acceptance 110
3 3791 E0004 Operational 1473
4 3791 E0019 Operational Back-order 0
Upvotes: 0
Views: 239
Reputation: 13
SELECT COUNT(*) as COUNT, JCDS_SOGR.OBJNR, JCDS_SOGR.STAT, TJ30T.TXT30, DIF =
CASE
WHEN COUNT(*) > 1 THEN DATEDIFF(DAY,MIN(JCDS_SOGR.UDATE),MAX(JCDS_SOGR.UDATE))
WHEN COUNT(*) = 1 THEN DATEDIFF(DAY,MIN(JCDS_SOGR.UDATE),GETDATE())
END
FROM JCDS_SOGR
JOIN TJ30T
ON JCDS_SOGR.STAT = TJ30T.ESTAT
WHERE JCDS_SOGR.OBJNR = 'IE000000000010003137'
AND TJ30T.SPRAS='E'
AND TJ30T.MANDT='400'
AND STSMA = 'VEHICLE'
GROUP BY JCDS_SOGR.OBJNR, JCDS_SOGR.STAT, TJ30T.TXT30
Upvotes: 0
Reputation: 4790
The COALESCE
function can be used to substitute the current date, GETDATE()
, for null values. This can also be done using the ISNULL
function, however COALESCE
is ANSI standard which allows for use across more database platforms if necessary. From your question, it looks like you only want to use the current date when all values in this column are null, thus COALESCE
is outside of the MAX
function. If you want to replace any nulls with the current date, then compare these to the non-null values the COALESCE
function will need to be placed inside MAX
.
(
SELECT
JCDS_SOGR.OBJNR, JCDS_SOGR.STAT, TJ02T.TXT30, DATEDIFF(DAY,MIN(JCDS_SOGR.UDATE), COALESCE(MAX(JCDS_SOGR.UDATE), GETDATE()))
AS DIF
FROM JCDS_SOGR
JOIN TJ02T ON JCDS_SOGR.STAT = TJ02T.ISTAT
WHERE JCDS_SOGR.OBJNR = 'IE000000000010003791'
AND TJ02T.SPRAS = 'E'
GROUP BY JCDS_SOGR.OBJNR,JCDS_SOGR.STAT,TJ02T.TXT30)
UNION ALL
(
SELECT JCDS_SOGR.OBJNR, JCDS_SOGR.STAT, TJ30T.TXT30, DATEDIFF(DAY,MIN(JCDS_SOGR.UDATE), COALESCE(MAX(JCDS_SOGR.UDATE), GETDATE()))
AS DIF
FROM JCDS_SOGR
JOIN TJ30T ON JCDS_SOGR.STAT = TJ30T.ESTAT
WHERE JCDS_SOGR.OBJNR = 'IE000000000010003791'
AND TJ30T.SPRAS = 'E'
AND TJ30T.MANDT='400'
AND TJ30T.STSMA = 'VEHICLE'
GROUP BY JCDS_SOGR.OBJNR,JCDS_SOGR.STAT,TJ30T.TXT30)
Upvotes: 1