【问题标题】:Join to additional table without aggregates summing the duplicated values加入附加表而不聚合重复值
【发布时间】:2021-06-19 13:56:26
【问题描述】:

我有以下代码。

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

每次我尝试加入表格时,数据都会变得疯狂并且非常错误!

感谢您的帮助!


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

表一:

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

表 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

【问题讨论】:

  • “数据变得疯狂并且非常错误”。请提供关于错误的具体详细信息
  • 请提供样本数据并简要说明您的需求。
  • 你好两个,我已经在我的问题中添加了更多内容,希望这会有所帮助:)
  • 假设一个销售人员在历史表中可以有很多销售。同样,他们可以有许多未结订单。所以你有一个多对多的关系,你的行在连接中成倍增加。要解决此问题,请在子查询中进行分组。
  • @HoneyBadger 是对的,您不能只在整个集合上使用GROUP BY,删除 group 子句以查看它正在操作的所有行。子查询、交叉应用和/或窗口函数可以在这里为您提供帮助。

标签: sql sql-server-2014


【解决方案1】:

看起来像 APPLY 的情况,尽管它也可以作为 CTE/派生表的连接来完成。

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)

【讨论】:

  • 您好,感谢您的解决方案,但它似乎仍然导致数据不正确:(
【解决方案2】:

聚合之前加入:

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

【讨论】:

  • 嗨,戈登,这正是我需要的!非常感谢!
猜你喜欢
  • 2020-09-19
  • 2015-01-04
  • 2017-12-17
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多