2015-06-14 2 views
2

У меня есть две таблицы, похожие на приведенные ниже (просто для исключения полей).Поворот столбцов в строки для объединенных таблиц

Таблица lead:

id | fname | lname |  email 
--------------------------------------------- 
1 | John  | Doe  | [email protected] 
2 | Mike  | Johnson | [email protected] 

Таблица leadcustom:

id | leadid  | name   | value 
------------------------------------------------- 
1 | 1   | utm_medium | cpc 
2 | 1   | utm_term  | fall 
3 | 1   | subject  | business 
4 | 2   | utm_medium | display 
5 | 2   | utm_term  | summer 
6 | 2   | month  | may 
7 | 2   | color  | red 

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

То, что я пытаюсь сделать, это сделать объединение, где я могу захватить все поля из таблицы lead вместе с utm_medium и utm_term из leadcustom таблицы. Мне не нужны никакие дополнительные поля, даже если они были отправлены.

Желаемые результаты:

id | fname | lname | email  | utm_medium | utm_term 
--------------------------------------------------------------------------- 
1  | John  | Doe  | [email protected] | cpc   | fall 
2  | Mike  | Johnson | [email protected] | display  | summer 

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

Я ценю любую помощь с этим, и я не могу изменить способ захвата этих форматов данных и таблиц.

ответ

3

Если столбцы фиксированы, вы можете сделать это с группой на + случай + макс как это:

select 
    fname, 
    lname, 
    email, 
    max(case when name = 'utm_medium' then value end) as utm_medium, 
    max(case when name = 'utm_term' then value end) as utm_term 
from 
    lead l 
    join leadcustom c 
    on l.id = c.leadid 
group by 
    fname, 
    lname, 
    email 

Случай присвоит значение из таблицы leadcustom, когда он совпадает с заданным именем, в противном случае он будет return null, а max будет выбирать принятое значение, если оно существует над нулем.

Вы можете проверить это в SQL Fiddle

Другой способ сделать это состоит в использовании оператора поворота, но синтаксис немного сложнее - или, по крайней мере, это более легко для меня.

+0

Это отлично подойдет для меня. благодаря – Chris

0

Вы можете попробовать с pivot и join:

select [id] 
    , [fname] 
    , [lname] 
    , [email] 
    , [utm_medium] 
    , [utm_term] 
from (select t2.* 
      , t1.[name] 
      , t1.[value] 
     from [leadcustom] t1 
     join [lead] t2 on t2.[id] = t1.[leadid] 
) t 
pivot (
     max([value]) 
     for [name] in ([utm_medium], [utm_term]) 
) pt 

pivot вращает присоединяемой таблицы-значной выражение, поворачивая уникальные значения из [value] столбца в выражении в [utm_medium] и [utm_term] столбцов в выходных данных, и выполняет фальшивую агрегацию с помощью функции max (работает так, потому что соответствующий столбец может иметь несколько значений для одного уникального поворотного столбца, в этом случае [name] для [value]).

SQLFiddle

0

Вы можете использовать или производную таблицу cte, чтобы решить эту проблему:

КТР:

;with cte as 
(
    select leadid, [name], [value] 
    from leadcustom 
    where name in('utm_medium', 'display') 
) 

select id, fname, lname, email, [name], [value] 
from lead 
inner join cte on(id = leadid) 

Производная таблица:

select id, fname, lname, email, [name], [value] 
from lead 
inner join 
(
    select leadid, [name], [value] 
    from leadcustom 
    where name in('utm_medium', 'display') 
) derived on(id = leadid) 

и так Суслов используется JamesZ годов скрипка, I will use it too ...

0

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

select ld.*, ldcust.utm_medium, ldcust.utm_term 
from lead ld 
left join leadcustom ldcust 
on ld.id = ldcust.leadid 
0
declare @t table (Id int,fname varchar(10),lname varchar(10),email varchar(20)) 
insert into @t(Id,fname,lname,email)values (1,'john','doe','[email protected]'),(2,'mike','johnson','[email protected]') 
declare @tt table (id int,leadid int,name varchar(10),value varchar(10)) 
insert into @tt(id,leadid,name,value)values 
(1,1,'utm_medium','cpc'), 
(2,1,'utm_term','fall'), 
(3,1,'subject','business'), 
(4,2,'utm_medium','display'), 
(5,2,'utm_term','summer'), 
(6,2,'month','may'),(7,2,'color','red') 
select Id,fname,lname, 
email, 
[utm_medium], 
[utm_term] 
from (
select t.Id, 
t.fname, 
t.lname, 
t.email, 
tt.name, 
tt.value 
    from @t t JOIN @tt tt 
    ON t.Id = tt.leadid)R 
PIVOT(MAX(value) for name IN([utm_medium],[utm_term]))P 
Смежные вопросы