我正在尝试避免重复。有时它显示重复记录,我不明白我做错了什么。
答案 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语句表明类似/相同的值来自两个不同的表/视图:
特别是:
另外,不是说这是错的,但Full Outer Join用法看起来很可疑。
怀疑您可能想要查看以下两者之一或两者:
一旦你选择了#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