[英]Getting one row of data pr month even though there is no data for that month
可以说我有一份销售报告:
Salesman | Sales | Month | yr |
A 5 1 2016
A 12 1 2017
A 3 1 2017
A 25 5 2017
B 20 4 2017
B 49 6 2017
如果我想查看销售人员的总销售量,我将执行以下操作:
SELECT salesman, sum(SALES), MONTH from SALESTABLE GROUP BY Salesman, Mnth where year = 2017
得到:
Salesman | Sales | Mnth | yr |
A 15 1 2017
A 25 5 2017
B 20 4 2017
B 49 6 2017
但是我想要以下内容:
Salesman | Sales | Mnth | yr |
A 15 1 2017
A 0 2 2017
A 0 3 2017
...
A 25 5 2017
...
我尝试了以下方法:
DECLARE @MonthTable TABLE
(
Monthnumber int
)
DECLARE @cnt int = 0
while @cnt < 12
BEGIN
SET @cnt = @cnt+1
Insert into @MonthTable (monthnumber) values (@cnt)
END
SELECT salesman,
sum(SALES),
monthnumber
FROM SALESTABLE
RIGHT JOIN @MonthTable ON monthnumber = mnth
GROUP BY Salesman, monthnumber
但是,这正如预期的那样在“推销员”上给出了NULL
。
通过生成月份列表并交叉加入不同的销售人员和年份列表以重新加入表格,我们可以按生成的月份进行分组和汇总,如下所示:
;with months as (
select Mnth
from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) t(Mnth)
)
select
s.Salesman
, s.Yr
, m.Mnth
, Sales = coalesce(sum(t.Sales),0)
from (
select distinct Salesman, yr
from t
) as s
cross join months m
left join t
on s.Salesman = t.Salesman
and s.Yr = t.Yr
and m.Mnth = t.[Month]
where s.yr = 2017
group by s.Salesman, s.Yr, m.Mnth
extrester演示: http ://rextester.com/ZOHB53144
收益:
+----------+------+------+-------+
| Salesman | Yr | Mnth | Sales |
+----------+------+------+-------+
| A | 2017 | 1 | 15 |
| A | 2017 | 2 | 0 |
| A | 2017 | 3 | 0 |
| A | 2017 | 4 | 0 |
| A | 2017 | 5 | 25 |
| A | 2017 | 6 | 0 |
| A | 2017 | 7 | 0 |
| A | 2017 | 8 | 0 |
| A | 2017 | 9 | 0 |
| A | 2017 | 10 | 0 |
| A | 2017 | 11 | 0 |
| A | 2017 | 12 | 0 |
| B | 2017 | 1 | 0 |
| B | 2017 | 2 | 0 |
| B | 2017 | 3 | 0 |
| B | 2017 | 4 | 20 |
| B | 2017 | 5 | 0 |
| B | 2017 | 6 | 49 |
| B | 2017 | 7 | 0 |
| B | 2017 | 8 | 0 |
| B | 2017 | 9 | 0 |
| B | 2017 | 10 | 0 |
| B | 2017 | 11 | 0 |
| B | 2017 | 12 | 0 |
+----------+------+------+-------+
正如您正确地创建了一个月表以提供那些没有销售的月份的月条目一样,您需要一个主业务员表来为销售员提供那些没有销售的月份的信息。
以最简单的形式,您可以通过获取distinct salesman
从salesdata
表生成主业务员表; 理想情况下,您可能希望使用一个单独的销售员表,每个销售员都有一个条目。
该查询将变为:
SELECT salesman,
sum(SALES),
monthnumber
FROM SALESTABLE
RIGHT JOIN @MonthTable ON monthnumber = mnth
GROUP BY Salesman, monthnumber
SELECT
salesmanlist.salesman
, SUM(salestable.sales)
, monthtable.monthnumber
FROM
(SELECT DISTINCT salesman FROM salestable) as salesmanlist -- <-- Key change
CROSS JOIN @MonthTable as monthtable
LEFT JOIN salestable
ON salesmanlist.salesman = salestable.salesman
AND salestable.mnth = monthtable.monthnumber
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.