2016-02-29 2 views
1

Привет, мне нужно объединить 2 таблицы с информацией о клиентах. В таблице 2 указано, есть ли у нас информация о клиенте по электронной почте, адресу и номеру телефона, но данные структурированы, поэтому каждый клиент имеет 3 строки. Есть ли способ объединить эти две таблицы, чтобы я получал только одну строку для каждого клиента, но со всеми контактными данными?Несколько строк с информацией в одну строку

Таблица 1:

id customerID ... ... 

1 11 

2 99 

и Таблица 2:

id customerID Channel Y_N 

1 11   Email Y 

2 11   Address Y 

3 11   Phone N 

4 99   Email N 

5 99   Address Y 

6 99   Phone N 

Мой код это

TABLE 1 
left join(
    select customerID, 
    case when Y_N='Y' and Channel='Email' then 1 else 0 end as Email 
    FROM table2 
    where Channel='Email')a 
    on table1.customerID=a.customerID 
Left join(
    select customerID, 
    case when Y_N='Y' and Channel='Address' then 1 else 0 end as Address 
    FROM table2 
    where Channel='Address') b 
    on table1.customerID=b.customerID 
Left join(
    select customerID, 
    case when Y_N='Y' and Channel='Phone' then 1 else 0 end as Phone 
    FROM table2 
    where Channel='SMS') c 
    on table1.customerID=c.customerID 

, который фактически делает работу, но если я должен сделать это снова в будущем есть ли более разумный способ?

Спасибо

ответ

1

Вы можете заменить эти три соединяется с одной usong условной агрегации (= ось):

TABLE1 
left join(
    select customerID, 
     max(case when Y_N='Y' and Channel='Email' then 1 else 0 end) as Email 
     max(case when Y_N='Y' and Channel='Address' then 1 else 0 end) as Address 
     max(case when Y_N='Y' and Channel='Phone' then 1 else 0 end) as Phone 
    FROM table2 
    GROUP BY 1) a 
    on table1.customerID=a.customerID 

Это может быть более эффективным, проверьте Поясните ...

0

Ну, если он работает, почему это изменить? Но если у вас есть, может быть что-то вроде:

SELECT 
    c.*, 
    IF(e.Y_N='Y',1,0) AS Email, 
    IF(a.Y_N='Y',1,0) AS Address, 
    IF(p.Y_N='Y',1,0) AS Phone 
FROM table1 AS c 
    LEFT JOIN table2 AS e ON(c.customerID=e.customerID AND Channel='Email') 
    LEFT JOIN table2 AS a ON(c.customerID=a.customerID AND Channel='Address') 
    LEFT JOIN table2 AS p ON(c.customerID=p.customerID AND Channel='Phone') 

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

customerID|Email|Address|Phone 
    11 | 1 | 1 | 0 
    99 | 0 | 1 | 0 

Такое, что вы можете просто сделать

SELECT * FROM table1 AS a LEFT JOIN table2 AS b ON a.customerID=b.customerID 
+0

Я не отвечает за создание базы данных, я бы тоже предпочел бы она структурирована, как вы показать его :) Спасибо – IDDQD

0

Если вы ждете новых каналов в будущем вы могли использовать эту функцию, чтобы динамически добавлять каналы, как колонки:

DECLARE @SearchList  varchar(MAX) 
DECLARE @sql   varchar(MAX) 

select @SearchList = COALESCE(@SearchList, '') + ', [' + cast(Channel as VARCHAR(100)) + ']' 
from (select distinct channel from #table2) a 

set @sql = 'select CustomerID, ' + RIGHT(@SearchList, LEN(@SearchList)-1) +' 
from 
(select CustomerID, Channel, Y_N 
    from #table2) as t 
pivot 
(
    max(Y_N) 
    for Channel in (' + RIGHT(@SearchList, LEN(@SearchList)-1) + ') 
) as pvt' 

exec(@sql) 
Смежные вопросы