counting case statement
-
mercoledì 18 aprile 2012 22:04
Hello,
Im trying to get this query to return in a specific way and am not sure if i need to start over or if i can expand on this query. Im in sql management studio 2008, sql server 2005. This case statement is working for labeling orders in the results correctly but im having trouble counting it properly.
I want it to display like this:
Client Due Today Due Tomorrow Past Due … Total client count of status per client count of status per client count of status per client count of row client client SELECT
COUNT(DeliveryStatus) FROM (SELECT
CASE
WHEN dbo.TruncateDate(CURRENT_TIMESTAMP) = dbo.TruncateDate(oi.RequiredByDate) THEN 'Due Today'
WHEN CURRENT_TIMESTAMP > oi.RequiredByDate THEN 'Past Due'
WHEN DATEADD(dd, DATEDIFF(dd, 0, oi.RequiredByDate), 0) = dateadd(day, datediff(day, '19000101',CURRENT_TIMESTAMP),'19000102') then 'Due Tomorrow'
WHEN DateDiff(day, getdate(), RequiredByDate) BETWEEN 2 and 7 AND DateName(weekday, RequiredByDate) = 'Monday' Then 'Due Monday'
ELSE 'Due Beyond' end
as DeliveryStatus
FROM
OrderItems oi
JOIN
Orders o ON o.OrderID = oi.OrderID
JOIN
Counties c ON c.FIPS = o.FIPS
JOIN
Clients cl ON cl.ClientID = o.ClientID
JOIN
Milestones m ON m.MilestoneID = oi.LastMilestoneID
JOIN
Products p ON p.ProductID = oi.ProductID
JOIN
Vendors v ON v.VendorID = oi.VendorID
LEFT
JOIN ClientBranches clb ON clb.ClientID = o.ClientID
WHERE
QueueID > 0
and cl.Name not like ('Tes%')) AS Total
GROUP BY DeliveryStatus
Tutte le risposte
-
mercoledì 18 aprile 2012 22:14did some research and figured this out, thanks for anyone that is working on it now
-
mercoledì 18 aprile 2012 22:14Moderatore
Try:
;with cte as (SELECT cl.ClientID, cl.Name as Client, o.OrderID, CASE WHEN CURRENT_TIMESTAMP > oi.RequiredByDate THEN 'Past Due' WHEN DATEADD(dd, DATEDIFF(dd, 0, oi.RequiredByDate), 0) = dateadd(day, datediff(day, '19000101',CURRENT_TIMESTAMP),'19000102') then 'Due Tomorrow' WHEN DateDiff(day, getdate(), RequiredByDate) BETWEEN 2 and 7 AND DateName(weekday, RequiredByDate) = 'Monday' Then 'Due Monday' WHEN dbo.TruncateDate(CURRENT_TIMESTAMP) = dbo.TruncateDate(oi.RequiredByDate) THEN 'Due Today' ELSE 'Due Beyond' end as DeliveryStatus FROM OrderItems oi JOIN Orders o ON o.OrderID = oi.OrderID JOIN Counties c ON c.FIPS = o.FIPS JOIN Clients cl ON cl.ClientID = o.ClientID JOIN Milestones m ON m.MilestoneID = oi.LastMilestoneID JOIN Products p ON p.ProductID = oi.ProductID JOIN Vendors v ON v.VendorID = oi.VendorID LEFT JOIN ClientBranches clb ON clb.ClientID = o.ClientID WHERE QueueID > 0 -- which table? and cl.Name not like 'Tes%') select *, coalesce([Due Today],0) + coalesce([Past Due],0) + coalesce([Due Tomorrow],0) + coalesce([Due Monday],0) + coalesce([Due Beyond],0) as [Total] from cte PIVOT (COUNT(o.OrderID) FOR [DeliveryStatus] IN ([Due Today],[Past Due], [Due Tomorrow], [Due Monday], [Due Beyond])) pvt
For every expert, there is an equal and opposite expert. - Becker's Law
My blog
- Modificato Naomi NMicrosoft Community Contributor, Moderator mercoledì 18 aprile 2012 22:16
- Modificato Naomi NMicrosoft Community Contributor, Moderator mercoledì 18 aprile 2012 22:17
- Contrassegnato come risposta KJian_ mercoledì 25 aprile 2012 07:24
-
mercoledì 18 aprile 2012 22:15
Basically you need:
Select Client, SUM(CASE WHEN dbo.TruncateDate(CURRENT_TIMESTAMP)= dbo.TruncateDate(oi.RequiredByDate) THEN 1 ELSE 0 END) as DueTodayCount, SUM(CASE WHEN CURRENT_TIMESTAMP > oi.RequiredByDate THEN 1 ELSE 0 END) as PASTDueCount, 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 DueTomorrowCount, SUM(CASE WHEN dbo.TruncateDate(CURRENT_TIMESTAMP)= dbo.TruncateDate(oi.RequiredByDate) THEN 1 WHEN CURRENT_TIMESTAMP > oi.RequiredByDate THEN 1 WHEN DATEADD(dd, DATEDIFF(dd, 0, oi.RequiredByDate), 0) = dateadd(day, datediff(day, '19000101',CURRENT_TIMESTAMP),'19000102') then 1 ELSE 0 END as Total GROUP BY Client
Chuck

