Оставлено соединение, производящее неправильные данные - PullRequest
0 голосов
/ 06 июня 2018

Я работаю над объединением двух таблиц: контакты, тип контакта.Таблица контактов содержит контактные данные, а таблица контактов содержит контактные данные.

Ниже приведена таблица контактов:

enter image description here

Таблица типов контактов:

enter image description here

Желаемый выход для одного клиента:

enter image description here

Левое соединение, которое я использую в своем запросе, дает неправильные результаты.Я добавил свою ссылку для ректера здесь.Любая помощь будет принята с благодарностью!

Ссылка Rexter: http://rextester.com/live/QGMAD33217

*** Новая ссылка Rexter (без редактирования в реальном времени: http://rextester.com/KSP51539

Запрос:

create table contacttype(ctype_id int,ctype varchar(20))
insert contacttype values
( 12    ,'Ctype1'),
( 13    ,'Ctype2'),
( 14    ,'Ctype3')

create table contacts(cid int,ctype_id int,name varchar(20), phone varchar(15))
insert contacts values
(1001,  12  ,'Tim', 1234567890),
(1001,  13  ,'Joe', 9874563210),
(1001,  14  ,'Jack',    6547893214),
(1002,  12  ,'Jane',    6547896125),
(1002,  13  ,'Smith',   null),
(1002,  14  ,'Jill',    9878445623 )

select c.cid,
       max(case when ct.ctype = 'Ctype1' then c.name end) as [ctype1_name],
       c1.phone,
       max(case when ct.ctype = 'Ctype2' then c.name end) as [ctype2_name],
       c2.phone,
       max(case when ct.ctype = 'Ctype3' then c.name end) as [ctype3_name],
       c3.phone
from contacts c
join contacttype ct on c.ctype_id = ct.ctype_id
left join contacts c1 on c1.ctype_id = ct.ctype_id and ct.ctype = 'Ctype1'
left join contacts c2 on c2.ctype_id = ct.ctype_id and ct.ctype = 'Ctype2'
left join contacts c3 on c3.ctype_id = ct.ctype_id and ct.ctype = 'Ctype3'
group by c.cid,c1.phone,c2.phone,c3.phone

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

В качестве альтернативы, вы можете использовать оператор отношения поворота, если значения ctype_id предопределены

declare @contacttype table (ctype_id int,ctype varchar(20))
insert @contacttype values
( 12    ,'Ctype1'),
( 13    ,'Ctype2'),
( 14    ,'Ctype3');

declare @contacts table (cid int,ctype_id int,name varchar(20), phone varchar(15))
insert @contacts values
(1001,  12  ,'Tim', 1234567890),
(1001,  13  ,'Joe', 9874563210),
(1001,  14  ,'Jack',    6547893214),
(1002,  12  ,'Jane',    6547896125),
(1002,  13  ,'Smith',   null),
(1002,  14  ,'Jill',    9878445623 );

with A as (
    select 
        cid, [12] as ctype1_name, [13] as ctype2_name, [14] as ctype3_name
    from
        (select cid, ctype_id, name from @contacts) p pivot (max(name) for ctype_id in ([12],[13],[14])) as pvt
), B as (
    select 
        cid, [12] as phone1, [13] as phone2, [14] as phone3
    from
        (select cid, ctype_id, phone from @contacts) p pivot (max(phone) for ctype_id in ([12],[13],[14])) as pvt
)
select
    A.cid, A.ctype1_name, B.phone1, A.ctype2_name, B.phone2, A.ctype3_name, B.phone3
from
    A inner join B on (A.cid = B.cid)
0 голосов
/ 06 июня 2018

Теперь, когда у вас есть стабильная ссылка, легко увидеть, что пошло не так.У вас есть условная агрегация, но это было не совсем так, как вы хотите.Это должно дать результат, который вы ищете.

select c.cid
    , ctype1_name = max(case when ct.ctype = 'Ctype1' then c.name end) 
    , phone1 = max(case when ct.ctype = 'Ctype1' then c.phone end) 
    , ctype2_name = max(case when ct.ctype = 'Ctype2' then c.name end) 
    , phone2 = max(case when ct.ctype = 'Ctype2' then c.phone end) 
    , ctype3_name = max(case when ct.ctype = 'Ctype3' then c.name end) 
    , phone3 = max(case when ct.ctype = 'Ctype3' then c.phone end) 
from contacts c
join contacttype ct on c.ctype_id = ct.ctype_id
group by c.cid
...