2010-08-05 63 views
3

我試圖創建一個查詢,將產生約40的自定義列的交叉檢驗表格,顯示Y或N.現在我有SQL Server查詢 - 循環問題

SELECT DISTINCT [Company], 
     [Option1], 
     [Option2], 
     [Option3],    
     CASE 
     WHEN [Table1].[ID1] IN (SELECT ID2 FROM Table2 WHERE Variable = 1 AND Bit = 1) THEN 
      'Y' 
     ELSE 'N' 
     END AS 'CustomColumn1:', 
     CASE 
     WHEN [Table1].[ID1] IN (SELECT ID2 FROM Table2 WHERE Variable = 2 AND Bit = 1) THEN 
      'Y' 
     ELSE 'N' 
     END AS 'CustomColumn1:',  
     CASE 
     WHEN [Table1].[ID1] IN (SELECT ID2 FROM Table2 WHERE Variable = 3 AND Bit = 1) THEN 
      'Y' 
     ELSE 'N' 
    END AS 'CustomColumn1:', 
    ............. 
    -- REPEAT ANOTHER 40 times 
    FROM [Table1] 
    WHERE [Table1].[OtherCondition] = 'True' 
    ORDER BY [Company] 

所以我的問題是,我該如何創建一個循環(while?for?),它將循環變量,並根據條件爲行分配Y或N,而不是創建40個Case語句?

+0

我假設您的示例中存在拼寫錯誤,並且CustomColumn應該用變量遞增(CustomColumn1,CustomColumn2 ...),而不是總是「CustomColumn1」。 – 2010-08-05 20:54:08

+0

感謝Joe,您是對的,CustomColumn名稱確實會更改,並非總是CustomColumn1。 – wes 2010-08-05 21:10:55

回答

2

您不能使用循環,但可以創建一個存儲過程/函數來執行子選擇和大小寫表達式,並調用該函數40次。

另外,你可以通過改變它提高了子選擇的性能

SELECT 1 FROM Table2 WHERE EXISTS [Table2].[ID2] = [Table1.ID1] AND Variable = 3 AND Bit = 1 
+0

是的,這就是我現在所做的,創建一個包含所有表達式的SP。只是認爲應該有一個更有效的方式與SQL。 搜索與循環語句(遊標表)相關的內容,但不知道它如何幫助我的原因。 – wes 2010-08-05 21:13:10

+0

循環/光標只有在您執行動態查詢時纔會有所幫助......使用SQL將查詢構建爲字符串,然後調用存儲過程以執行該字符串......這是一個骯髒的解決方案,我不推薦它。如果我的回答有幫助,請將其標記爲已接受,我們都會獲得一些聲望點。 – 2010-08-06 04:54:16

+0

如果此答案有幫助,請務必將其標記爲「已接受」,我們將因此獲得更多的聲譽。 – 2010-08-10 18:34:17

0

一種方法可以一直使用透視說法,這是在MS SQL 2005+。但即使如此,您還是必須將1 ... 40個硬編碼列置於pivot語句中。

我能想到的其他方式是創建動態SQL,但並不是那麼推薦,所以我們可以做的是我們可以通過在表上運行while循環來創建一個動態sql查詢,並且可以創建大的sql然後我們可以使用sp_execute執行它。所以,步驟將是。

int @loopVar 

SET @loopVar = 0 

int @rowCount 

varchar @SQL 

SET @SQl = '' 
Select @rowcount = Count(ID2) from Table2 

WHILE(@loopVar <= @rowCount) 

BEGIN 

// create ur SQL here 

END 

sp_execute(@SQL) 
2

循環(即遍歷遊標)對行而不是列起作用。你仍然必須有40個表達式,每列一個,表現會很糟糕。

讓SQL Server完成它的工作。通過準確地告訴您需要什麼並創建適當的索引來做到這一點。也就是說,更換

CASE WHEN [Table1].[ID1] IN (SELECT ID2 FROM Table2 WHERE Variable = 2 AND Bit = 1) 

CASE WHEN EXISTS (SELECT 0 FROM Table2 WHERE ID2 = [Table1].[ID1] AND Variable = 2 AND Bit = 1) 
1

如果輸出所以比模式千差萬別,有是否綱要正確型號的業務需求的問題。也就是說,我會建議只編寫SQL。您可以簡化SQL就像這樣:

Select Company 
    , Option1, Option2, Option3 
    , Case When T2.Variable = 1 Then 'Y' Else 'N' End As CustomCol1 
    , Case When T2.Variable = 2 Then 'Y' Else 'N' End As CustomCol2 
    , Case When T2.Variable = 3 Then 'Y' Else 'N' End As CustomCol3 
    , Case When T2.Variable = 4 Then 'Y' Else 'N' End As CustomCol4 
... 
From Table1 As T1 
     Left Join Table2 As T2 
      On T2.ID2 = T1.ID 
       And T2.Bit = 1 
Where T1.OtherCondition = 'True' 
Group By T1.Company 
Order By T1.Company 

如果你想要寫的東西,可以幫助你自動根的案例陳述(和你正在使用SQL Server 2005 +),你可以這樣做:

With Numbers As 
    (
    Select 0 As Value 
    Union All 
    Select Value + 1 
    From Numbers 
    Where Value < 41 
    ) 
Select ', Case When T2.Variable = ' + Cast(N.Value As varchar(10)) + ' Then ''Y'' Else ''N'' End As CustomCol' + Cast(N.Value As varchar(10)) 
From Numbers As N 

您將運行查詢並將結果複製並粘貼到您的過程或代碼中。