【问题标题】:Join and sum doubling results加入并求和加倍结果
【发布时间】:2020-09-14 20:15:44
【问题描述】:

我有两个表,t_tran_log 和 t_item_master。

当我对 t_tran_log 运行此查询时,我得到了准确的结果:

declare @startdate as datetime; declare @enddate as datetime
set @startdate = '9/13/20 5am'; set @enddate = dateadd(hour,24,@startdate)

select
cast(t.start_tran_date+t.start_tran_time  - '1900-01-01 05:00' as date) tran_date
,t.item_number
,sum(t.tran_qty) qty

from t_tran_log t

where t.start_tran_date+t.start_tran_time >= @startdate
and t.start_tran_date+t.start_tran_time < @enddate
and t.tran_type = '750'  and t.description like 'Customer Return' and t.hu_id not like '1Z%'

group by cast(t.start_tran_date+t.start_tran_time  - '1900-01-01 05:00' as date), t.item_number

但是当我尝试通过左连接从另一个表中提取额外的项目详细信息时,我突然得到了项目数量的两倍结果!我做错了什么?

declare @startdate as datetime; declare @enddate as datetime
set @startdate = '9/13/20 5am'; set @enddate = dateadd(hour,24,@startdate)

select
cast(t.start_tran_date+t.start_tran_time  - '1900-01-01 05:00' as date) Date
,t.item_number
,i.dept_name
,i.class_name
,i.subclass_name
,sum(t.tran_qty) qty

from t_tran_log t

left join t_item_master i on t.item_number = i.item_number

where t.start_tran_date+t.start_tran_time >= @startdate
and t.start_tran_date+t.start_tran_time < @enddate
and t.tran_type = '750'  and t.description like 'Customer Return' and t.hu_id not like '1Z%'

group by cast(t.start_tran_date+t.start_tran_time  - '1900-01-01 05:00' as date), t.item_number, i.dept_name, i.class_name, i.subclass_name

【问题讨论】:

  • 简短回答:您进行多对多联接而不是一对多联接,即 ´t_item_master.item_number` 不是唯一的

标签: sql join sum left-join


【解决方案1】:

item_master 中可能有多行与连接条件匹配。结果,行数相乘,聚合函数出错。

首先考虑在子查询中进行预聚合:

select t.*, i.dept_name, i.class_name, i.subclass_name
from (
    select
        cast(t.start_tran_date+t.start_tran_time  - '1900-01-01 05:00' as date) tran_date
        ,t.item_number
        ,sum(t.tran_qty) qty
    from t_tran_log t
    where 
        t.start_tran_date + t.start_tran_time >= @startdate
        and t.start_tran_date+t.start_tran_time < @enddate
        and t.tran_type = '750'  
        and t.description like 'Customer Return' 
        and t.hu_id not like '1Z%'
    group by 
        cast(t.start_tran_date+t.start_tran_time  - '1900-01-01 05:00' as date), 
        t.item_number
) t
left join t_item_master i on t.item_number = i.item_number

【讨论】:

  • 抱歉,这不太奏效。现在我得到每个项目编号的两行结果?
猜你喜欢
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多