簡體   English   中英

即使該月沒有數據,也要在每個月獲取一行數據

[英]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 salesmansalesdata表生成主業務員表; 理想情況下,您可能希望使用一個單獨的銷售員表,每個銷售員都有一個條目。

該查詢將變為:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM