2015-10-20 102 views
-3

我試圖讓這個循環自動化,我定義了一個開始和結束時間段@t_begin,@ t_end例如從0開始到24。 目前,我將所有這些代碼一個接一個,例如結束t = 60,我需要複製並粘貼60個子查詢。如何結合SQL中的子查詢中的循環?

下面的事情是tMONTHS = 0,1,2,......我不想把它們全部複製到t = 24例如。

SELECT 
    (
    SELECT COUNT(CODE) FROM #TEMP 
    WHERE (tMONTHS = 0) AND (KANALKODU = @channel) AND (tSTATUS = 2) AND (TARIH < @datelimit) 
    ) as T, 
    (
    SELECT COUNT(CODE) FROM #TEMP 
    WHERE (tMONTHS = 1) AND (KANALKODU = @channel) AND (tSTATUS = 2) AND (TARIH < @datelimit) 
    ) as t1, 
    (
    SELECT COUNT(CODE) FROM #TEMP 
    WHERE (tMONTHS = 2) AND (KANALKODU = @channel) AND (tSTATUS = 2) AND (TARIH < @datelimit) 
    ) as t2, 
    (
    SELECT COUNT(CODE) FROM #TEMP 
    WHERE (tMONTHS = 3) AND (KANALKODU = @channel) AND (tSTATUS = 2) AND (TARIH < @datelimit) 
    ) as t3; 
GO 
+1

寫作快訊全部大寫不會讓你幫忙更快。事實上,它可能會延遲幫助。 –

+0

您只需編寫一個查詢,將您的數據放入24行,然後使用'PIVOT'運算符將它們轉換爲列。您仍然需要列出列,但重複代碼少得多。大約有10億個關於堆棧溢出的示例以及官方文檔等。 –

+1

下面是查詢的一個簡短示例,將它放入行中。剛樞轉它:'SELECT COUNT(CODE) FROM #TEMP WHERE(tMONTHS = 0) AND(KANALKODU = @channel) AND(tSTATUS IN(0,2,3,4)) AND(TARIH <@ datelimit)' –

回答

1

首先創建一個數字表。這個數字將代表幾個月,幾天,任何你需要的東西。

SELECT TOP 10000 N=IDENTITY(INT, 0, 1) 
INTO dbo.Numbers 
FROM master.dbo.syscolumns a CROSS JOIN master.dbo.syscolumns b; 

我會推薦將看到這篇文章的額外信息https://dba.stackexchange.com/questions/11506/why-are-numbers-tables-invaluable

然後創建列表每月

 SELECT COUNT(tMONTHS) as code_count, tMONTHS as month FROM #TEMP CROSS JOIN Numbers 
     WHERE (tMONTHS = n) AND (KANALKODU = @channel) AND 
      (tSTATUS = 2) AND (TARIH < @datelimit) 
      AND n BETWEEN @t_begin AND @t_end 

這resulset帶來每月一排兩列,code_count和月。現在你可以PIVOT。

注:我已經拿到吃飯,看你以後

+0

這個數字解決方案非常豐富,簡要地檢查了這篇文章。 – EMRE

+0

但是,當我直接粘貼代碼上面的SELECT函數給出的Numbers.n變量不包含在聚合函數或組中,錯誤應該是一個俗氣的錯誤,我們忘記了,或者我的初學者錯誤,因爲我不知道該怎麼辦你的意思是'現在你可以穿上'。看看你的代碼,它對我來說似乎是一個最終版本 – EMRE

+0

看到我的編輯,讓我知道 – Horaciux