1 part of case clause not working correctly - sql

im having a little trouble with a case clause. The problem is in the last portion ending in DueBeyond, i need this to return any of our orders in our system that is due beyond tomorrow, as in 2 days from today. sorry to be overly obvious.
SUM(CASE WHEN CURRENT_TIMESTAMP > oi.RequiredByDate THEN 1 ELSE 0 END) as PastDue
,SUM(CASE WHEN DATEADD(dd, DATEDIFF(dd, 0, oi.RequiredByDate), 0) = dateadd(day, datediff(day, '19000101',CURRENT_TIMESTAMP),'19000102') then 1 ELSE 0 END) as DueTomorrow
,SUM(CASE WHEN dbo.TruncateDate(CURRENT_TIMESTAMP) = dbo.TruncateDate(oi.RequiredByDate) THEN 1 Else 0 END) as DueToday
,SUM(CASE WHEN DateDiff(day, getdate(), RequiredByDate) BETWEEN 2 and 7 AND DateName(weekday, RequiredByDate) = 'Monday' Then 1 ELSE 0 END) as DueMonday
,SUM(CASE WHEN dbo.TruncateDate(CURRENT_TIMESTAMP) <= dbo.TruncateDate(oi.RequiredByDate) THEN 1 ELSE 0 END) as DueBeyond

If you add two days to the current date and then see if that is still less than or equal to your required date it must be no sooner than two days in the future.
,SUM(CASE WHEN DATEADD(DAY, 2,dbo.TruncateDate(CURRENT_TIMESTAMP)) <=
dbo.TruncateDate(oi.RequiredByDate) THEN 1 ELSE 0 END) as DueBeyond

Related

How to display 0 in all the columns in a table when sum returned for all the columns is 0?

Currently I am getting Blank columns But I want 0 Here as shown in the image. Click here for the Image. Below is my query and I want all the columns to display 0 when sum returned is 0.
SELECT COUNT(*) AS Inserted,
SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS Pending,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS Completed,
SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) AS Failure
FROM [dbo].[ETIME_TIMECARD]
where cast(CreateDateTime as date) = CAST(GETDATE() AS DATE)
Group By cast(CreateDateTime as date)
You're getting no results because your WHERE isn't returning any results and you have a GROUP BY with nothing to group on. In truth, the GROUP BY appears to not be required.
SELECT COUNT(*) AS Inserted,
ISNULL(SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END),0) AS Pending,
ISNULL(SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END),0) AS Completed,
ISNULL(SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END),0) AS Failure
FROM [dbo].[ETIME_TIMECARD]
WHERE CreateDateTime >= CAST(GETDATE() AS date)
AND CreateDateTime < CAST(DATEADD(DAY, 1, GETDATE()) AS date);
Though, personally, I would switch to a COUNT as you clearly are counting, and then you don't need to ISNULL, as a COUNT will not return NULL:
SELECT COUNT(*) AS Inserted,
COUNT(CASE status WHEN 0 THEN 1 END) AS Pending,
COUNT(CASE status WHEN 1 THEN 1 END) AS Completed,
COUNT(CASE status WHEN 2 THEN 1 END) AS Failure
FROM [dbo].[ETIME_TIMECARD]
WHERE CreateDateTime >= CAST(GETDATE() AS date)
AND CreateDateTime < CAST(DATEADD(DAY, 1, GETDATE()) AS date);

Get data of 2 different dates in 2 different columns sql

I have a sql table having columns Name, VisitingDate, StayTime
I want a query which can give me data in which in 1 column I can get data of thismonthvisit and other column I can get data of lastmonthvisit and in 3rd column I can data of summation of StayTime of particular person .
Database Table : --
Name
VisitingDate
StayTime(in minutes)
A
2021-04-20
5
A
2021-04-21
15
A
2021-03-20
10
B
2021-03-20
5
Result Wanted : --
Name
Thismonthvisit
TotalStayTimeThismonth(in minutes)
LastmonthVisit
TotalStayTimelastmonth(in minutes)
A
2
20
1
10
B
0
0
1
5
Here is what you are looking for :
select name,
SUM(CASE WHEN FORMAT(VisitingDate, 'YYYYMM') = FORMAT(getdate(),'YYYYMM') THEN 1 ELSE 0 END) AS ThisMonthVisit,
SUM(CASE WHEN FORMAT(VisitingDate, 'YYYYMM') = FORMAT(getdate(),'YYYYMM') THEN StayTime ELSE 0 END) AS TotalStayTimeThisMonth,
SUM(CASE WHEN FORMAT(VisitingDate, 'YYYYMM') = FORMAT(dateadd(month, -1, getdate()),'YYYYMM') THEN 1 ELSE 0 END) AS LastMonthVisit,
SUM(CASE WHEN FORMAT(VisitingDate, 'YYYYMM') = FORMAT(dateadd(month, -1, getdate()),'YYYYMM') THEN StayTime ELSE 0 END) AS TotalStayTimeLastMonth
from MyTable
where FORMAT(VisitingDate, 'YYYYMM') > FORMAT(dateadd(month, -2, getdate()),'YYYYMM')
group by Name
SEE DEMO HERE
You can use aggregation:
select name,
sum(case when month(visitingdate) = month(getdate())
then 1 else 0
end) as cnt_thismonth,
sum(case when month(visitingdate) = month(getdate())
then staytime else 0
end) staytime_thismonth,
sum(case when month(visitingdate) <> month(getdate())
then 1 else 0
end) as cnt_lastmonth,
sum(case when month(visitingdate) <> month(getdate())
then staytime else 0
end) staytime_lastmonth
from t
where visitingdate >= dateadd(month, -1, datefromparts(year(getdate()), month(getdate()), 1))
group by name;

Get the last 14 days of records not included current date

I'm having trouble with the dates. I have here my code to count the records for the last 14 days from the current date but not including TODAY in the display.
Here's my SQL query
SELECT
a.TrackingCode,
a.SegmentName,
a.Brand,
a.DateAdded,
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 1 THEN 1 ELSE NULL END) as "Day_1",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 2 THEN 1 ELSE NULL END) as "Day_2",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 3 THEN 1 ELSE NULL END) as "Day_3",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 4 THEN 1 ELSE NULL END) as "Day_4",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 5 THEN 1 ELSE NULL END) as "Day_5",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 6 THEN 1 ELSE NULL END) as "Day_6",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 7 THEN 1 ELSE NULL END) as "Day_7",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 8 THEN 1 ELSE NULL END) as "Day_8",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 9 THEN 1 ELSE NULL END) as "Day_9",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 10 THEN 1 ELSE NULL END) as "Day_10",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 11 THEN 1 ELSE NULL END) as "Day_11",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 12 THEN 1 ELSE NULL END) as "Day_12",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 13 THEN 1 ELSE NULL END) as "Day_13",
COUNT(CASE WHEN DATEDIFF(DD, a.DateAdded, GETDATE()) = 14 THEN 1 ELSE NULL END) as "Day_14"
FROM
Journey_Injection_Logger_Base a
WHERE
a.DateAdded >= DATEADD(DD, -14, GETDATE())
AND a.DateAdded <= GETDATE()
GROUP BY
a.TrackingCode, a.SegmentName, a.Brand, a.DateAdded
The Day_1 is the yesterday's date. The problem is that when the next day comes it will add the new current date and my records for the Day_1 is not moving.
Sample output
enter image description here
From the above image of sample output. The record 2 should be in 4/14 TUE

Can somebody help me translate CASE statement with dates?

I need to modify a Stored Procedure, and I cant understand how day manipulate those dates in a WHERE clause. Especially when END=1. I have never see that before.
CASE WHEN #DateFrom IS NULL THEN 1 ELSE
CASE WHEN INV.InvoiceDate > INV.EffectiveDate THEN
CASE WHEN dateDiff(d, #DateFrom, INV.InvoiceDate) >= 0
AND dateDiff(d, #DateTo, INV.InvoiceDate) <= 0 Then 1 else 0 end
ELSE
CASE WHEN dateDiff(d, #DateFrom, INV.EffectiveDate) >= 0
AND dateDiff(d, #DateTo, INV.EffectiveDate) <= 0 Then 1 else 0 end
END
END = 1
when you convert it into single case it seems easier to understand:
CASE
WHEN #DateFrom IS NULL THEN 1
WHEN #DateFrom IS NOT NULL AND dateDiff(d, #DateFrom, INV.InvoiceDate) >= 0 AND dateDiff(d, #DateTo, INV.InvoiceDate) <= 0 THEN 1
ELSE 0 END =1
you could also try this
CASE
WHEN #DateFrom IS NULL THEN 1 ELSE
(CASE
WHEN dateDiff(d, #DateFrom, INV.InvoiceDate) >= 0 AND dateDiff(d, #DateTo, INV.InvoiceDate) <= 0 THEN 1 ELSE 0
END)
END)
END = 1
what i'm getting at is the second level of this case is weird. the when and else cases are the same, so it doesn't need to be there.
(CASE
WHEN INV.InvoiceDate > INV.EffectiveDate
THEN (CASE
WHEN dateDiff(d, #DateFrom, INV.InvoiceDate) >= 0 AND dateDiff(d, #DateTo, INV.InvoiceDate) <= 0 THEN 1 ELSE 0
END)
ELSE (CASE
WHEN dateDiff(d, #DateFrom, INV.EffectiveDate) >= 0 AND dateDiff(d, #DateTo, INV.EffectiveDate) <= 0 THEN 1 ELSE 0
END)
This one is gives an error. I think parenthesis is missing somewhere
CASE
WHEN #DateFrom IS NULL THEN 1 ELSE
(CASE
WHEN dateDiff(d, #DateFrom, INV.InvoiceDate) >= 0 AND dateDiff(d, #DateTo, INV.InvoiceDate) <= 0 THEN 1 ELSE 0
END)
END)
END = 1

Group by year in sql

I am trying to group by year but was not able to do.I can get the column count but not year wise. this is what i tried.
select t_contract ,
sum(CASE t_contract when '18' then 1 else 0 end) as XL,
sum(CASE t_contract when '01' then 1 else 0 end) as VC,
sum(CASE t_contract when '75' then 1 else 0 end) as AN,
sum(CASE t_contract when '48' then 1 else 0 end) as CS
from icps.dbo.tickets
WHERE
t_date_time_issued >= DATEADD(year, -6, GETDATE())
GROUP BY contract
.. but i want to add year .. where i have t_date_time _issued column.
My another query is I have a column called t_zone_name and I want to sum all the rows where t_zone_anme like '%ICeland%' an i tried this:
sum(CASE t_zone_name like '%ICeland%' then 1 else 0 end) as ICELAND
but I get an error on statement like... thanks in advance.
LIKE
YEAR XL VC AN CS total
2010 50 50 50 50 200
2011 5 5 5 5 20
Try the below query:
SELECT t_contract, YEAR(t_date_time_issued) As Yr, SUM(CASE WHEN t_zone_name like '%ICeland%' THEN 1 ELSE 0 END) AS ICELAND
SUM(CASE t_contract when '18' then 1 else 0 end) as XL,
SUM(CASE t_contract when '01' then 1 else 0 end) as VC,
SUM(CASE t_contract when '75' then 1 else 0 end) as AN,
SUM(CASE t_contract when '48' then 1 else 0 end) as CS
FROM icps.dbo.tickets
WHERE YEAR(t_date_time_issued) >= (YEAR(GetDate()) - 6)
GROUP BY t_contract, YEAR(t_date_time_issued)
You might need change the order of t_contract and YEAR(t_date_time_issued) depending on which grouping you want to apply first.
As suggested by #ray I have replaced DATEPART(yyyy, t_date_time_issued) >= DATEPART(yyyy, DATEADD(year, -6, GETDATE())) with year(t_date_time_issued) >= (year(GetDate()) - 6)
If you want to group by year, in sql server, you might
GROUP BY DATEDIFF(year,t_date_time_issued, GETDATE())
In other DB engine, usually has method to get year part, or use substring to get year part from a time string.