Условное соединение 3 таблиц - сложность с указанием, какую таблицу и столбец вернуть - PullRequest
0 голосов
/ 21 февраля 2020

Работает на SQL Сервер

У меня есть 3 таблицы

[TESTDB].[dbo].[TestList]
[Routing].[dbo].[WUList]
[Routing].[dbo].[WUArea]

[TESTDB]. [Dbo]. [TestList] данные выглядят как

TestID
1089
41651
1235
6987
51555
71666

[Routing]. [Dbo]. [WUList] данные выглядят как

TestIDS    AreaPerson1   AreaPerson2    AreaPerson3
01089      TSmith        MBlevins       OMyhead
01099      RJohns        NULL           NULL
03368      RJohns        TPayne         MSmith
45646      TSmith        MBlevins       NULL
55566      NULL          MBlevins       WRestle
77788      ORandy        NULL           LOrdy
02347      MArt          TPayne         MSmith
03333      NULL          NULL           NULL 
04444      NULL          NULL           NULL

[Routing]. [Dbo]. [WUArea] данные выглядят как

Area AreaPerson1   AreaPerson2    AreaPerson3
01   ORandy        MBlevins       OMyhead
03   RJohns        SNicks         IPfreely
04   RJohns        MBlevins       BFort
07   TSmith        SNicks         BFort
41   MArt          TSmith         WRestle
45   ORandy        ORandy         ORandy        
51   ...           ...            ...
52   ...           ...            ...
71   ...           ...            ...

Я был Я могу присоединиться к [TestList] к [UWArea] ИЛИ [WUList] как мне нужно, чтобы данные отображались, но я не могу объединить 3 списка так, как мне нужно.

  1. Не каждый TestID появляется в [WUList] или [WUArea]
  2. Если TestID появляется в [UWList], не каждый столбец содержит значение
  3. Некоторые TestID появляются в [WUList] и каждый столбец в [WUList] содержит NULL

Конечная цель

  1. Общими полями соединения являются [TestList]. [TestID], [WUList ]. [TestIDS] и [WUArea]. [Area]

  2. Возвращаемые столбцы [TestID], [AreaPerson1], [AreaPerson2], [AreaPerson3]

  3. При присоединении [TestList] к [WUList], если какой-либо из «персонажей» возвращает NULL, соедините первые две цифры [TestID] с [WUArea]. [Area] и получите соответствующий 'person'

  4. ** [TestList]. [TestID] длиной 4 цифры должен иметь 0, прикрепленный к LEFT 1st di git при присоединении к [WUArea] .[Площадь]. [TestID], длина которого составляет пять цифр, можно объединить, используя ЛЕВЫЕ две цифры

  5. Если [TestList]. [TestID] не отображается в [WUList] или в левой 2 цифры [TestList]. [TestID] не отображаются в [WUArea], установите [AreaPerson1] = JDoe, [AreaPerson2] = SDoe, [Areaperson3] = TBuck

Этот сохранил меня на ночь. Ваша помощь будет очень высоко ценится.

1 Ответ

0 голосов
/ 21 февраля 2020
create table TestList
(
TestID int
)

insert TestList
values
(1089)
, (41651)
, (1235)
, (6987)
, (51555)
, (71666)
, (01099)
, (03368)
, (45646)
, (55566)
, (77788)
, (02347)
, (03333)
, (04444)

create table WUList
(
TestIDS int,
AreaPerson1 varchar(10)
, AreaPerson2 varchar(10)
, AreaPerson3 varchar(10)
)

insert WUList
values
('01089','TSmith','MBlevins','OMyhead')
, ('01099','RJohns',NULL,NULL)
, ('03368','RJohns','TPayne','MSmith')
, ('45646','TSmith','MBlevins',NULL)
, ('55566',NULL,'MBlevins','WRestle')
, ('77788','ORandy',NULL,'LOrdy')
, ('02347','MArt','TPayne','MSmith')
, ('03333',NULL,NULL,NULL)
, ('04444',NULL,NULL,NULL)

create table WUArea
(
Area varchar(3),
AreaPerson1 varchar(10)
, AreaPerson2 varchar(10)
, AreaPerson3 varchar(10)
)

insert WUArea
values
('01','ORandy','MBlevins','OMyhead')
, ('03','RJohns','SNicks','IPfreely')
, ('04','RJohns','MBlevins','BFort')
, ('07','TSmith','SNicks','BFort')
, ('41','MArt','TSmith','WRestle')
, ('45','ORandy','ORandy','ORandy')

select a.TestID
    , case
        when b.TestIDS is null or c.Area is null then 'JDoe'
        else ISNULL(b.AreaPerson1,c.AreaPerson1)
    end as AreaPerson1
    , case
        when b.TestIDS is null or c.Area is null then 'SDoe'
        else ISNULL(b.AreaPerson2,c.AreaPerson2)
    end as AreaPerson2
    , case
        when b.TestIDS is null or c.Area is null then 'TBuck'
        else ISNULL(b.AreaPerson3,c.AreaPerson3)
    end as AreaPerson3
from TestList a
        left join WUList b on a.TestID = b.TestIDS
        left join WUArea c on '0' + LEFT(a.TestID,1) = c.Area

обратите внимание: в приведенном выше примере данных в TestList недостаточно связанных данных, поэтому я добавил TestIDS из таблицы WUList в таблицу TestList, чтобы больше с ними можно было работать.

я взбил это довольно быстро, поэтому, если есть какие-либо другие вариации в наборах данных ваших таблиц, вам нужно будет отрегулировать. до сих пор он охватывает всю вашу базу (по крайней мере из того, что я могу понять)

, если вы хотите увидеть больше данных в наборе результатов, чтобы убедиться, что учитываются значения NULL, используйте приведенное ниже утверждение.

select a.TestID, '0' + LEFT(a.TestID,1) as WUAreaTestID
    , b.AreaPerson1
    , case
        when b.TestIDS is null or c.Area is null then 'JDoe'
        else ISNULL(b.AreaPerson1,c.AreaPerson1)
    end as AreaPerson1n
    , b.AreaPerson2
    , case
        when b.TestIDS is null or c.Area is null then 'SDoe'
        else ISNULL(b.AreaPerson2,c.AreaPerson2)
    end as AreaPerson2n
    , b.AreaPerson3
    , case
        when b.TestIDS is null or c.Area is null then 'TBuck'
        else ISNULL(b.AreaPerson3,c.AreaPerson3)
    end as AreaPerson3n
    , c.*
from TestList a
        left join WUList b on a.TestID = b.TestIDS
        left join WUArea c on '0' + LEFT(a.TestID,1) = c.Area

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...