我想將多個表連接在一起。我試圖加入的其中一個表每個數據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個小時。
有什麼不同的,更有效的解決方案,我想完成什麼?我需要有第一個代碼的速度,但第二個代碼的結果。
大概是(你可以儘管檢查)這是一個的服用時間,而不是CTE,但是我希望你可以簡化與COALESCE([CharV]熱膨脹係數的值=行的支點,[NumV] 0 ),看看是否有任何影響。 – Rikalous
不幸的是,這是行不通的,因爲沒有任何字段是真正的空值。如果CharV沒有值,那麼它是一個空字符串「」,如果NumV沒有值,它只是0. –