2017-02-03 48 views
3

我想將多個表連接在一起。我試圖加入的其中一個表每個數據ID有數百行。我試圖將每個ID的約100行轉爲列。我嘗試使用的值並不總是在同一行中。下面是一個例子(我的真實表格每個ID有數百行)。例如在ID 1中的AccNum可能在NumV列中,但對於ID 2它可能在CharV列中。更有效地旋轉行

ID QType  CharV  NumV 
1 AccNum     10 
1 EmpNam  John Inc 0 
1 UW   Josh  0 
2 AccNum  11 
2 EmpNam  CBS   0 
2 UW   Dan   0 

我所用的原代碼是一個SELECT語句數百行像下面一個:

Max(Case When PM.[QType] = 'AccNum' Then NumV End) as AccNum 

此代碼與數百上在不到10分鐘內完成線。然而,問題在於,只從我指定的列中提取值,所以我將一直丟失不同列中的數據。 (在上面的例子中,我會得到AccNum 10,但不是AccNum11,因爲它在CharV列中)。

我更新的代碼使用一個支點:

;with CTE 
As 
(
    Select [PMID], [QType], 
     Value=concat(Nullif([CharV],''''),Nullif([NumV],0)) 
     From [DBase].[dbo].[PM] 
) 

Select C.[ID] AS M_ID 
    ,Max(c.[AccNum]) As AcctNum 
    ,Max(c.[EmpNam]) As EmpName 

等等...

然後我選擇我的所有數百行,然後轉動它的數據:

from CTE 
pivot (max(Value) for [QType] in ([AccNum],[EmpNam],(more rows)))As c 

但是,這段代碼的問題在於它需要運行將近2個小時。

有什麼不同的,更有效的解決方案,我想完成什麼?我需要有第一個代碼的速度,但第二個代碼的結果。

+0

大概是(你可以儘管檢查)這是一個的服用時間,而不是CTE,但是我希望你可以簡化與COALESCE([CharV]熱膨脹係數的值=行的支點,[NumV] 0 ),看看是否有任何影響。 – Rikalous

+0

不幸的是,這是行不通的,因爲沒有任何字段是真正的空值。如果CharV沒有值,那麼它是一個空字符串「」,如果NumV沒有值,它只是0. –

回答

2

也許你可以通過使用UNION ALL

Select ID,QType,Value=CharV From @YourTable where CharV>'' 
Union All 
Select ID,QType,Value=cast(NumV as varchar(25)) From @YourTable where NumV>0 

對於條件聚合方法

不用擔心減少Concat/NullIf處理哪些領域,只是參考值

Select [ID] 
     ,[Accnum] = Max(Case When [QType] = 'AccNum' Then Value End) 
     ,[EmpNam] = Max(Case When [QType] = 'EmpNam' Then Value End) 
     ,[UW]  = Max(Case When [QType] = 'UW'  Then Value End) 
From (
     Select ID,QType,Value=CharV From @YourTable where CharV>'' 
     Union All 
     Select ID,QType,Value=cast(NumV as varchar(25)) From @YourTable where NumV>0 
    ) A 
Group By ID 

對於PIVOT方法

Select [ID],[AccNum],[EmpNam],[UW] 
From (
     Select ID,QType,Value=CharV From @YourTable where CharV>'' 
     Union All 
     Select ID,QType,Value=cast(NumV as varchar(25)) From @YourTable where NumV>0 
    ) A 
Pivot (max([Value]) For [QType] in ([AccNum],[EmpNam],[UW])) p 
+0

對於這種方法,Union All會在CTE內,還是在後面的select語句? –

+0

@VBA_SQL_Programmer我見過性能受到大型CTE的影響。查看這兩種方法的更新回答 –

+0

@VBA_SQL_Programmer我沒有意識到你正在處理的行有多可能,但是,TEMP表中沒有SHAME –