2015-10-20 104 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