I’ve got a working query where I can export to Excel and pivot myself to not be grouped by the fldTrancationDateTime
column and that is working fine as a short term solution.
Is the only option here to use SQL pivot so I can only group by the Product
and have each date range populated? Instead of one row for each date? Or am I going about coding this incorrectly?
x
declare @Date Date
set @Date = GETDATE()
print(@Date)
select T.fldProductCode, P.fldProductDescription, count(fldTransactionID),
case when datediff(d,cast(T.fldTransactionDateTime as date),@Date ) <= 7
then count(fldTransactionID) else 0 end as [0-7 Days],
case when datediff(d,cast(T.fldTransactionDateTime as date),@Date ) > 7 and datediff(d,cast(T.fldTransactionDateTime as date),@Date ) <= 14
then count(fldTransactionID) else 0 end as [7-14 Days],
case when datediff(d,cast(T.fldTransactionDateTime as date),@Date ) > 14 and datediff(d,cast(T.fldTransactionDateTime as date),@Date ) <= 21
then count(fldTransactionID) else 0 end as [14-21 Days],
case when datediff(d,cast(T.fldTransactionDateTime as date),@Date ) > 21 and datediff(d,cast(T.fldTransactionDateTime as date),@Date ) <= 28
then count(fldTransactionID) else 0 end as [21-28 Days],
case when datediff(d,cast(T.fldTransactionDateTime as date),@Date ) > 28
then count(fldTransactionID) else 0 end as [28+ Days]
from [transaction] T
join product P on P.fldProductCode = T.fldProductCode
where T.fldTransactionSold = 0
group by P.fldProductDescription,T.fldProductCode, cast(fldTransactionDateTime as DATE)
Advertisement
Answer
I am guessing you want conditional aggregation:
select T.fldProductCode, P.fldProductDescription,
count(fldTransactionID),
sum(case when datediff(day, T.fldTransactionDateTime, @Date) <= 7
then 1 else 0
end) as [0-7 Days],
sum(case when datediff(day, T.fldTransactionDateTime, @Date) between 8 and 14
then 1 else 0
end) as [7-14 Days],
sum(case when datediff(day, T.fldTransactionDateTime, @Date) between 15 and 21
then 1 else 0
end) as [14-21 Days],
sum(case when datediff(day, T.fldTransactionDateTime, @Date) between 22 and 28
then 1 else 0
end) as [22-28 Days],
sum(case when datediff(day, T.fldTransactionDateTime, @Date) > 28
then 1 else 0
end) as [21-28 Days],
from [transaction] T join product
P
on P.fldProductCode = T.fldProductCode
where T.fldTransactionSold = 0
group by P.fldProductDescription, T.fldProductCode;;
The case
expression is the argument to the sum()
rather than the other way around.