Как создать несколько конкатенации на несколько левых соединений в запросе - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь присоединить таблицу HE к таблице S, как показано в приведенном ниже коде.

Чтобы получить совпадение и объединить данные, мне нужно сопоставить идентификатор клиента и рынок, как показано ниже в [Headendmarket & tbcode] и [SETClientID + Market] из таблиц S и HE.

а потому что некоторые данные в столбцах не чистые. конкат выше не достаточен, и в соединении есть некоторые недостающие элементы в S.

решение для меня будет состоять в том, чтобы дополнительно просмотреть данные для данных, которые остались нулевыми после выполнения запроса ниже, и сделать еще один конкат на S. [Market] & s. [Client] и еще раз присоединиться к нему с 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])

1 Ответ

0 голосов
/ 25 марта 2019

Укажите ВСЕ таблицы и столбцы, в которых нет «Чистых данных».И привести примеры - например, Bad =; ShouldBe =.Эти столбцы могут повлиять на то, как мы поступим.И избавьтесь от посторонних столбцов, которые не являются частью проблемы.

Тем временем вы можете определить точные грязные данные и добавить некоторые дополнительные условия ... Примечание: этот sql позволит вам увидетьNULL по обе стороны от состояния 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
...