加入额外的 table 而不聚合对重复值求和

Join to additional table without aggregates summing the duplicated values

我有以下代码。

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_1 和 Salesperson_Invoiced 是可加入的字段:)

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

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

每次我尝试加入表格时,数据都会变得异常,而且是非常错误的!

感谢您的帮助!


这是我得到的输出数据示例:

Table一个:

Salesperson_Invoiced NetNet_Revenue_Func MTD NetNet_Revenue_Func YTD GM_Func_Net MTD GM_Func_Net YTD
James 500 1000 250 500
Harry 600 1200 300 600
Potter 700 1400 350 700

Table 2

Salesperson_Invoiced BO_AUD
James 500000
Harry 600000
Potter 700000

这就是我想要实现的目标:

Salesperson_Invoiced NetNet_Revenue_Func MTD NetNet_Revenue_Func YTD GM_Func_Net MTD GM_Func_Net YTD BO_AUD
James 500 1000 250 500 500000
Harry 600 1200 300 600 600000
Potter 700 1400 350 700 700000

我尝试使用的代码是

Select distinct  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,
        sum(Value_Func) as BO_AUD
From    Sales_History t
inner join Open_Orders on
t.Salesperson_Invoiced = Open_Orders.Salesperson_1
Where   t.PG1    = 'Lighting' 
And     t.Office = 'AU' 
And     t.Year   = Year(getdate())
Group By t.Salesperson_Invoiced,Salesperson_1

但是当我尝试使用它时 A) 来自其中一个 MTD 的真实数据从 6586.00 变为 111962.00 B) BO_AUD 对于同一个人吹出到 10907652.210 应该是 119374.310

聚合加入之前:

select sh.*, oo.*
from (Select sh.Salesperson_Invoiced,        
              Sum(Case When month(sh.TranDate) = Month(getdate()) Then sh.NetNet_Revenue_Func End) MTD_REV,
              Sum(Case When month(sh.TranDate) = Month(getdate()) Then sh.GM_Func_Net End) MTD_GM,
              SUM (Case When sh.Year = Year(getdate()) Then sh.NetNet_Revenue_Func End) YTD_REV,
              SUM (Case When sh.Year = Year(getdate()) Then sh.GM_Func_Net End) YTD_GM
      From Sales_History sh
      Where sh.PG1    = 'Lighting' AND
            sh.Office = 'AU' AND
            sh.Year   = Year(getdate())
      Group By sh.Salesperson_Invoiced
     ) sh left join
     (SELECT Salesperson_1, sum(Value_Func) as BO_AUD
      FROM Datawarehouse.dbo.Open_Orders
      where Office = 'AU' and PG1 = 'Lighting'
      group by Salesperson_1
     ) oo
     on sh.Salesperson_Invoiced = oo.Salesperson_1

看起来像 APPLY 的情况,尽管它也可以作为 CTE/derived table.[ 的连接来完成=17=]

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,
        o.BO_AUD
From    Sales_History t
OUTER APPLY (
    SELECT SUM(o.Value_Func) as BO_AUD
    FROM Open_Orders o
    WHERE t.Salesperson_Invoiced = o.Salesperson_1
) o
Where   t.PG1    = 'Lighting' 
And     t.Office = 'AU' 
And     t.Year   = Year(getdate())
Group By t.Salesperson_Invoiced, o.BO_AUD;

备注:

  • APPLY 的结果进入 GROUP BY,因为它已经针对每个 Salesperson_Invoiced
  • 分组
  • 我建议您找到一种更好的按日期过滤的方法。为了使用索引,您不能在列上使用函数。所以不用 month(t.TranDate) = Month(getdate())... 使用 t.TranDate >= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) AND t.TranDate < DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()) + 1, 1)