如何在我的SQL Server标准中执行JOIN查询?

时间:2017-05-26 20:27:07

标签: sql join stored-procedures rdbms outer-join

我正在尝试避免重复。有时它显示重复记录,我不明白我做错了什么。

3 个答案:

答案 0 :(得分:1)

我格式化了SQL,因此它更具可读性。此外,顶部的case语句应该只是一个coalesce()或isnull()而不是case语句。

我认为,问题在于JEDnineDays实际上并不包含所有返回的ItemId,因此您的其他连接不会相互连接。您需要在连接语句中添加多个条件。例如:

on (JEDnineDays.itemid = MECnineDays.itemid OR JEDthirtyDays.itemid = MECnineDays.itemid OR ... etc)

或者,可能更好的方法是执行FROM Item表,然后加入其余表。这将确保所有表都可以连接回现有项目。一旦你知道你将在FROM子句中拥有所有ItemId,你可以根据需要将所有完整的外连接更改为左连接。

修正了SQL:

select 
    itemid
    ,convert(DECIMAL(10,2),JEDnineDays.NineDaysSold) JEDNineDaysSold
    ,convert(DECIMAL(10,2),MECnineDays.NineDaysSold) MECNineDaysSold
    ,convert(DECIMAL(10,2),JEDthirtyDays.ThirtyDaysSold) JEDThirtyDaysSold
    ,convert(DECIMAL(10,2),MECthirtyDays.ThirtyDaysSold) MECThirtyDaysSold
into #days
from Items i
full outer join (
    select itemid, sum(qtysold) as NineDaysSold
    from [JC_ItemDSP10days]
    where StoreID IN ('1201','1302','1400','1500')
    group by ItemID
) as JEDnineDays on(JEDnineDays.itemid = i.itemid)
full outer join (
    select itemid, sum(qtysold) as NineDaysSold
    from [JC_ItemDSP10days]
    where StoreID IN ('2001','2400','2200')
    group by ItemID
) as MECnineDays on(i.itemid = MECnineDays.itemid)
full outer join (
    select itemid, sum(qtysold) as ThirtyDaysSold
    from [JC_ItemDSP30Days]
    where StoreID IN ('1201','1302','1400','1500')
    group by ItemID
) as JEDthirtyDays on(i.itemid = JEDthirtyDays.itemid)
full outer join (
    select 
    itemid, sum(qtysold) as ThirtyDaysSold
    from [JC_ItemDSP30Days]
    where StoreID IN ('2001','2400','2200')
    group by ItemID
) as MECthirtyDays on(i.itemid = MECthirtyDays.itemid)

答案 1 :(得分:1)

您的第一个子查询可能不会返回所有ItemID值。 full join会将其他子查询中的值放在不同的行中。

使用完整列表开始查询,然后将其余部分加入:

from    (
        select  distinct ItemID
        from    JC_ItemDSP10days
        ) all_items
full outer join
        (
        ) sub1
on      sub1.ItemID = all_items.ItemID

答案 2 :(得分:-1)

我同意它们看起来像重复,但最初的ItemId CASE语句表明类似/相同的值来自两个不同的表/视图:

特别是:

  • MECnineDays.ItemID
  • JEDthirtyDays.ItemID

另外,不是说这是错的,但Full Outer Join用法看起来很可疑。

怀疑您可能想要查看以下两者之一或两者:

  • Union或Union All
  • 分组依据,使用Min()/ Max()/ Sum()

一旦你选择了#Days,这会产生预期的结果吗?

select itemid,
Sum(IsNull(JEDNineDaysSold,0)) JEDNineDaysSold,
Sum(IsNull(MECNineDaysSold,0)) MECNineDaysSold,
Sum(IsNull(JEDThirtyDaysSold,0)) JEDThirtyDaysSold,
Sum(IsNull(MECThirtyDaysSold,0)) MECThirtyDaysSold
from #days
group by itemid
order by itemid