【问题标题】:how to create multiple Concatenation on multiple left joins in a query如何在查询中的多个左连接上创建多个连接
【发布时间】:2019-03-25 19:07:44
【问题描述】:

我正在尝试将表 HE 连接到表 S,如下面的代码所示。

为了让我获得匹配并加入数据,我必须在 S 和 HE 表中的 [Headendmarket&tbcode] 和 [SETClientID+Market] 中连接客户 ID 和市场。

但是因为列中的一些数据不干净。上面的 concat 还不够,连接中的 S 中有一些缺失的东西。

对我来说,解决方案是在运行下面的查询后进一步查找保留为空的数据的数据,并在 S.[Market]&s.[client] 上执行另一个 concat 并与 HE 进一步左连接。[ HeadendMarket] 和 [HE.Advertisername]。这将匹配剩余的空数据以查看是否存在可能的匹配并带回它可以用于 S 表的数据。

不确定在此查询中执行此操作的最佳方式是什么?

SELECT DISTINCT CONCAT(HE.[AdvertiserTBCode],HE.[HeadendMarket]) AS [Headendmarket&tbcode]
      ,CONCAT(S.[CLIENTID],S.[Market]) AS [SETClientID+Market]
      ,HE.[CurrentRegionName]
      ,HE.[CurrentMarketName]
      ,HE.[CurrentSalesTeamName]
      ,HE.[CurrentSalesOfficeName]
      ,HE.[CurrentCorpAEName]
      ,HE.[CurrentAEType]
      ,HE.[AdvertiserTBCode]  --Has all the correct data--
      ,HE.[AdvertiserName]
      ,HE.[ParentAdvertiserName]
      ,HE.[HeadendRegion]
      ,HE.[HeadendMarket]  --has all correct data--
      ,HE.[CorpCategoryGroup]
      ,S.[Actuals vs projections]
      ,S.[Year]
      ,S.[Month]
      ,S.[Area]
      ,CASE S.[Market] --some markets not the same name which is why we are doing this to have the same markets as HE Table--
            WHEN 'Twin Cities' THEN 'Minneapolis - St. Paul'
            WHEN 'Fort Myers'  THEN 'Ft. Myers - Naples'
            WHEN 'Bowling Green' THEN 'Nashville'
            WHEN 'North Miss' THEN 'TUPELO'
            WHEN 'Monroe, LA' THEN 'Monroe' 
            WHEN 'Southern Miss-Hattiesburg/Laurel/Meridian' THEN 'SOUTHERN MISS'
            WHEN 'Northern Miss-Columbus/Tupelo' THEN 'Tulepo'
            WHEN 'Little Rock, AR' THEN 'Little Rock'
            WHEN 'Fort Wayne' THEN 'Ft. Wayne'
            WHEN 'Wheeling/Youngstown/Canfield' THEN 'WYC'
            WHEN 'Johnstown/Altoona/State College' THEN 'Johnstown-Altoona'
            WHEN 'Washington, D.C.' THEN 'Washington'
        ELSE S.[Market] END AS [SET Market]

      ,S.[Zone Type]
      ,S.[Category]
      ,S.[Subcategory]
      ,S.[Event]
      ,S.[Network]
      ,S.[AE]
      ,S.[Client]  -- some wrong fields--
      ,S.[ClientID] --some incorrect data entered. this with the market concatenation should match the data in the HE table in a perfect world.--
      ,S.[# Spots]
      ,S.[Gross ($)]


  FROM [REO].[dbo].[Sports] S
  LEFT JOIN [REO].[dbo].[HF_Final] HE

        ON CONCAT(S.[CLIENTID],CASE S.[Market]
            WHEN 'Twin Cities' THEN 'Minneapolis - St. Paul'
            WHEN 'Fort Myers'  THEN 'Ft. Myers - Naples'
            WHEN 'Bowling Green' THEN 'Nashville'
            WHEN 'North Miss' THEN 'TUPELO'
            WHEN 'Monroe, LA' THEN 'Monroe' 
            WHEN 'Southern Miss-Hattiesburg/Laurel/Meridian' THEN 'SOUTHERN MISS'
            WHEN 'Northern Miss-Columbus/Tupelo' THEN 'Tulepo'
            WHEN 'Little Rock, AR' THEN 'Little Rock'
            WHEN 'Fort Wayne' THEN 'Ft. Wayne'
            WHEN 'Wheeling/Youngstown/Canfield' THEN 'WYC'
            WHEN 'Johnstown/Altoona/State College' THEN 'Johnstown-Altoona'
            WHEN 'Washington, D.C.' THEN 'Washington'
            ELSE S.[Market] END) 
            = CONCAT(HE.[AdvertiserTBCode],HE.[HeadendMarket])

【问题讨论】:

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

请找出所有没有“清理数据”的表和列。 并举出例子——例如 Bad=;ShouldBe=。这些列可能会影响我们如何进行。并且,去掉不属于问题的无关列。

与此同时,您可以识别确切的脏数据并添加更多条件...注意:此 sql 将允许您在 ON 条件的任一侧看到空值。也就是有些HE数据可能不匹配,因为S数据不正确。

SELECT
    AllKeys.AdvertiserTBCode
    ,AllKeys.Market

    ,S.AdvertiserTBCode
    .S.Market

    ,HE.CLIENTID
    .HE.Market

From
-- get all of the possible keys from each side
(SELECT DISTINCT
    ,AdvertiserTBCode
    ,Market   -- or CASE Market...
 FROM [REO].[dbo].[Sports]

UNION

SELECT
    CLIENTID
    ,Market   -- or CASE Market...
FROM [REO].[dbo].[HF_Final] 
) as AllKeys

-- join each side to its keys
LEFT JOIN [REO].[dbo].[Sports] S
  ON  AllKeys.AdvertiserTBCode = S.AdvertiserTBCode
  And AllKeys.Market = S.Market

LEFT JOIN [REO].[dbo].[HF_Final] HE
  ON  AllKeys.AdvertiserTBCode = HE.CLIENTID
  And AllKeys.Market = HE.Market

Order By AllKeys.AdvertiserTBCode, AllKeys.Market

-- now filter those that you want to pay attention to
--Having maybe some nulls in certain fields

【讨论】:

  • 嗨,我添加了包含脏数据的字段。基本上 he 表中的任何内容都有干净的数据。和 S.[ClientID] 并输入了不正确的数据,但与 HE 表数据具有最佳匹配。 S.[Client] 的信息不正确,因为人们输入了错误的客户名称,因此不如 cliend id 可靠。这与 s.market 连接应该在完美世界中匹配 HE 表组合中的数据。但不幸的是,由于某些 id 在 S.[ClientID] 中输入错误。我们必须混合和匹配显示为 null 的其他字段。所以 s.client 是最好的匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多