2015-06-14 58 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_mediumutm_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

如果你的列是固定的,你可以用GROUP BY +案例+ MAX這樣做:

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表值的情況下,否則會返回null,並且max將選擇如果它存在於null之上,則接受分配的值。

可以在SQL Fiddle

的另一種方式做這個測試,這是使用旋轉操作,但語法是稍微複雜的 - 或者至少這是更容易讓我。

+0

這對我很好。謝謝 – Chris

0

您可以pivotjoin嘗試:

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或派生表來解決這個問題:

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

除非我不能正確解釋你的問題 - 在這種情況下,我很高興得到糾正 - 你可以實現你的目標,用一個簡單的左連接,你在第一個表的ID加入:

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