Reputation: 619
I have am trying to generate a table that looks like this in SQL Server:
Name | Mon | Tue | Wed | Thu | Fri | Sat | Sun | Total
Product1 | 2 | 0 | 1 | 0 | 1 | 0 | 0 | 4
Product2 | 2 | 1 | 0 | 1 | 0 | 0 | 0 | 4
Product3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1
I have my data currently sitting in three tables like the ones below:
ProductName
ID | Name
1 | Product1
2 | Product2
3 | Product3
ProductSelection
PID | CID
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
3 | 2
4 | 1
5 | 2
6 | 1
ProductOrder
ID | Name | SubmitDate
1 | John Doe | 6/15/2015
2 | Jane Doe | 6/15/2015
3 | Sam Doe | 6/16/2015
4 | Mark Doe | 6/17/2015
5 | Bob Doe | 6/18/2015
6 | Adam Doe | 6/19/2015
Now I know I need to use a PIVOT similar to this:
PIVOT (COUNT(Name) FOR [Day] IN (Mon, Tue, Wed, Thu, Fri, Sat, Sun)) AS PivotTable
But I am struggling on putting the rest of the query together. I don't know how to get the total either, perhaps a INNER JOIN? Any assistance would be greatly appreciated.
Upvotes: 0
Views: 866
Reputation: 31879
Aside from using PIVOT
, you can try using conditional aggregation:
SELECT
Name = pn.Name,
[Mon] = SUM(CASE WHEN DATENAME(WEEKDAY, po.SubmitDate) = 'Monday' THEN 1 ELSE 0 END),
[Tue] = SUM(CASE WHEN DATENAME(WEEKDAY, po.SubmitDate) = 'Tuesday' THEN 1 ELSE 0 END),
[Wed] = SUM(CASE WHEN DATENAME(WEEKDAY, po.SubmitDate) = 'Wednesday' THEN 1 ELSE 0 END),
[Thu] = SUM(CASE WHEN DATENAME(WEEKDAY, po.SubmitDate) = 'Thursday' THEN 1 ELSE 0 END),
[Fri] = SUM(CASE WHEN DATENAME(WEEKDAY, po.SubmitDate) = 'Friday' THEN 1 ELSE 0 END),
[Sat] = SUM(CASE WHEN DATENAME(WEEKDAY, po.SubmitDate) = 'Saturday' THEN 1 ELSE 0 END),
[Sun] = SUM(CASE WHEN DATENAME(WEEKDAY, po.SubmitDate) = 'Sunday' THEN 1 ELSE 0 END),
[Total] = COUNT(*)
FROM ProductOrder po
INNER JOIN ProductSelection ps
ON ps.PID = po.ID
INNER JOIN ProductName pn
ON pn.ID = ps.CID
GROUP BY pn.Name
RESULT
| Name | Mon | Tue | Wed | Thu | Fri | Sat | Sun | Total |
|----------|-----|-----|-----|-----|-----|-----|-----|-------|
| Product1 | 2 | 0 | 1 | 0 | 1 | 0 | 0 | 4 |
| Product2 | 2 | 1 | 0 | 1 | 0 | 0 | 0 | 4 |
| Product3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Upvotes: 1
Reputation: 2943
Try this:
select ProductName.Name, COUNT(ID), datename(dw,SubmitDate)
from ProductOrder
inner join ProductName on ProductOrder.ID = ProductName.ID
group by ProductName.Name, datename(dw, SubmitDate)
You will get all counts of each product sell count in each day of week
Upvotes: 0