销售额的 MTD 和 YTD SQL

MTD and YTD of Sales SQL

我有一个 table 叫 Sales_History

我需要做的是为某些销售人员填充 YTD 和 MTD。

我要玩的领域是:

Salesperson_Invoiced(需要分组依据) NetNet_Revenue_Func(需要 MTD 和 YTD 数据) GM_Func_Net(需要 MTD 和 YTD 数据) 我在 where 子句中使用的其他一些字段

我的第一次尝试是这样的:

Select t.Salesperson_Invoiced,
  Sum(y.NetNet_Revenue_Func) YTD_REV,
  Sum(m.NetNet_Revenue_Func) MTD_REV
  From Sales_History t
   join Sales_History y
      on y.Salesperson_Invoiced = t.Salesperson_Invoiced
         and datediff(year, y.TranDate, t.TranDate) = 0 
         and y.TranDate <= t.TranDate
   join Sales_History m
      on m.Salesperson_Invoiced = t.Salesperson_Invoiced
         and datediff(month, m.TranDate, t.TranDate) = 0 
         and m.TranDate <= t.TranDate
         where t.PG1 = 'Lighting' and t.Office = 'AU' and t.Year = '2021'
Group by t.Salesperson_Invoiced, t.TranDate

但这并没有给我想要的:(

我想看的是:

+----------------------+-------------------------+-------------------------+-----------------+-----------------+
| Salesperson_Invoiced | NetNet_Revenue_Func MTD | NetNet_Revenue_Func YTD | GM_Func_Net MTD | GM_Func_Net YTD |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+
| James                | 500                     | 600                     |                 |                 |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+
| John                 | 600                     | 700                     |                 |                 |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+
| Peter                | 700                     | 800                     |                 |                 |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+
| Harry                | 800                     | 900                     |                 |                 |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+
| Potter               | 900                     | 1000                    |                 |                 |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+

我知道上面的代码只有 NetNet_Revenue_Func 我想我会先得到一个工作然后再添加另一个。

如果有人可以让我知道我做错了什么,或者告诉我这一切是否都是错误的,那就太好了! :)

大家好,

感谢 Squirel

,我对代码做了一些修改,如下所示

这是做我正在做的事情的最佳方式吗:)?

Select  t.Salesperson_Invoiced,
        SUM (Case When t.Year = Year(getdate()) Then t.NetNet_Revenue_Func End) YTD_REV,
        Sum(Case When month(t.TranDate) = Month(getdate()) Then t.NetNet_Revenue_Func 
                 End) MTD_REV
From    Sales_History t
Where   t.PG1    = 'Lighting' 
And     t.Office = 'AU' 
And     t.Year   = Year(getdate())
Group By t.Salesperson_Invoiced

更新-

这是一个有效的 SQL

Select  t.Salesperson_Invoiced,        
        Sum(Case When month(t.TranDate) = Month(getdate()) Then t.NetNet_Revenue_Func End) MTD_REV,
        Sum(Case When month(t.TranDate) = Month(getdate()) Then t.GM_Func_Net End) MTD_GM,
        SUM (Case When t.Year = Year(getdate()) Then t.NetNet_Revenue_Func End) YTD_REV,
                SUM (Case When t.Year = Year(getdate()) Then t.GM_Func_Net End) YTD_GM
From    Sales_History t
Where   t.PG1    = 'Lighting' 
And     t.Office = 'AU' 
And     t.Year   = Year(getdate())
Group By t.Salesperson_Invoiced

我可以添加关注吗

我可以添加以下内容吗

SELECT Salesperson_1,sum(Value_Func) as BO_AUD
FROM Datawarehouse.dbo.Open_Orders
where Office = 'AU' and PG1 = 'Lighting'
group by Salesperson_1

所以我可以让它看起来像这样?

+----------------------+-------------------------+-------------------------+-----------------+-----------------+--------+
| Salesperson_Invoiced | NetNet_Revenue_Func MTD | NetNet_Revenue_Func YTD | GM_Func_Net MTD | GM_Func_Net YTD | BO_AUD |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+--------+
| James                | 500                     | 100                     |                 |                 |        |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+--------+
| John                 | 600                     | 200                     |                 |                 |        |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+--------+
| Peter                | 700                     | 300                     |                 |                 |        |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+--------+
| Harry                | 800                     | 400                     |                 |                 |        |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+--------+
| Potter               | 900                     | 1                       |                 |                 |        |
+----------------------+-------------------------+-------------------------+-----------------+-----------------+--------+

如果我对您的要求理解正确,您可以将您的查询简化为以下内容。

您不需要多次 JOIN Sales_History。您可以使用 CASE 表达式执行条件 SUM() 以获得 MTD 值。假设 MTD 你的意思是当月

Select  t.Salesperson_Invoiced,
        Sum(t.NetNet_Revenue_Func) YTD_REV,
        Sum(Case When month(t.TransDate) = Month(getdate()) 
                 Then t.NetNet_Revenue_Func 
                 End) MTD_REV
From    Sales_History t
Where   t.PG1    = 'Lighting' 
And     t.Office = 'AU' 
And     t.Year   = 2021
Group By t.Salesperson_Invoiced

对于 YTD 计算,您可以使用以下表达式。

SUM (Case When t.Year = Year(getdate()) 
          Then t.NetNet_Revenue_Func 
          End) YTD_REV

由于您在 table 中有 Year 列,我正在使用它。否则你也可以做

SUM (Case When Year(t.TransDate) = Year(getdate()) 
          Then t.NetNet_Revenue_Func 
          End) YTD_REV

无论如何,出于性能原因,您还应该在 WHERE 中过滤所需的时间段,就像您现在使用 t.Year = 2021

所做的一样

编辑:还修复了早期查询中的 table 别名拼写错误。 注意:table 中的 Year 列应该是 int 对吗?所以你不需要在年份 And t.Year = 2021

上使用单引号