【问题标题】:Join on everything else value if not in table如果不在表中,则加入其他所有值
【发布时间】:2012-09-27 09:10:56
【问题描述】:

我有一张尺寸表

@dimensions
Dateid  Rep Mkt Prodgroup
201111  002 S   001
201111  002 R   001
201111  002 S   002
201111  002 R   002
201111  002 S   003
201111  002 R   003
201111  002 S   004
201111  002 R   004
...

我想将它与此表连接起来以包含百分比。

@percentageincrease
Prodgroup   Mkt Percent
ALL         S   1.05
ALL         R   1.06
002         S   1.07
002         R   1.08
003         S   1.09
003         R   1.10

我想在MktProdgroup 加入他们,其中@dimensions.Prodgroup IN @percentageincrease.Prodgroup 和如果not in 然后加入ALL。所以输出表是

Dateid  Rep Mkt Prodgroup   Percent
201111  002 S   001         1.05 // joined on ALL
201111  002 R   001         1.06 // joined on ALL
201111  002 S   002         1.07 // joined on 002
201111  002 R   002         1.08 // joined on 002
201111  002 S   003         1.09 // joined on 003
201111  002 R   003         1.10 // joined on 003
201111  002 S   004         1.05 // joined on ALL
201111  002 R   004         1.06 // joined on ALL
...

作为我的加入条件我已经尝试过

on case p.Prodgroup 
    when N'ALL' 
    then d.prodgrpid 
    else p.Prodgrpid = d.prodgrpid
AND p.Mkt = d.Mkt

但它给了我

Dateid  Rep Mkt Prodgroup   Percent
201111  002 S   001         1.05
201111  002 R   001         1.06
201111  002 S   002         1.07
201111  002 R   002         1.08
201111  002 S   002         1.05 //Joined on ALL
201111  002 R   002         1.06 //Joined on ALL
201111  002 S   003         1.09
201111  002 R   003         1.10
201111  002 S   003         1.05 //Joined on ALL
201111  002 R   003         1.06 //Joined on ALL
201111  002 S   004         1.05
201111  002 R   004         1.06
...

@percentageincrease 表中的元组也在 ALL 条件下连接。

这是作为更大查询的一部分在 SQL Server 2008 上作为存储过程运行的。

【问题讨论】:

    标签: sql sql-server sql-server-2008 stored-procedures join


    【解决方案1】:

    假设表结构

    declare @dimensions table 
        (Dateid varchar(10),  Rep varchar(10), Mkt varchar(10),Prodgroup varchar(10))
    declare @percentageincrease table 
        (Prodgroup varchar(10),  Mkt varchar(10), [Percent] decimal(9,5))
    

    然后

    select 
         d.*, 
         isnull(pinc.[Percent], pincall.[Percent]) 
    from @dimensions d
        left join @percentageincrease pinc 
            on d.Mkt = pinc.Mkt
          and d.Prodgroup = pinc.Prodgroup
        left join @percentageincrease pincall
            on d.Mkt = pincall.Mkt
          and pincall.Prodgroup ='all'  
    

    【讨论】:

    • 我在 sqlfiddle 测试了您的查询并查看结果。 sqlfiddle.com/#!6/7aa65/1顺便别忘了转换Prodgroup的数据类型
    • 您将 prodgroup 作为 int - 所以连接不起作用。从上面的示例数据来看,它似乎是一个字符串。
    • 您是否尝试点击该链接?查看percent的值
    • @JohnWoo 是的。尝试使用我的答案中的表结构。
    • 非常感谢。那工作得很好。我为 SO 稍微简化了我的示例,因为我实际上是在修改现有联接 (@dimensions) 以增加百分比,但此示例适用于两种情况。
    【解决方案2】:

    试试这个:

    select * from 
    (
    select d.*,p.[Percent] from 
    dimensions d inner join percentageincrease p
    on d.Mkt = p.Mkt  and d.Prodgroup = p.Prodgroup 
    
    union 
    
    select d.*,p.[Percent] from 
    dimensions d  join percentageincrease p
    on d.Mkt = p.Mkt  and d.Prodgroup not in
      (select distinct d.Prodgroup  from  dimensions d inner join percentageincrease p
       on d.Mkt = p.Mkt  and d.Prodgroup = p.Prodgroup) 
      where p.Prodgroup='ALL'  
    ) a
    order by a.Prodgroup 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 2020-05-03
      • 2011-04-07
      • 2017-03-01
      • 1970-01-01
      • 2022-06-28
      • 2021-03-05
      • 1970-01-01
      相关资源
      最近更新 更多