创建查询以显示一周中每一天售出的产品数量

Create query to display number of products sold for each day of the week

我正在尝试在 SQL 服务器中生成一个看起来像这样的 table 服务器:

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

我的数据目前位于三个 table 中,如下所示:

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  

现在我知道我需要使用与此类似的 PIVOT:

PIVOT (COUNT(Name) FOR [Day] IN (Mon, Tue, Wed, Thu, Fri, Sat, Sun)) AS PivotTable

但我正在努力将查询的其余部分放在一起。我也不知道如何获得总数,也许是 INNER JOIN?如有任何帮助,我们将不胜感激。

试试这个:

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)  

您将获得一周中每一天的每个产品销售数量的所有计数

除了使用PIVOT,您还可以尝试使用条件聚合:

SQL Fiddle

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

结果

|     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 |