如何在case语句中创建循环

时间:2016-02-18 12:14:04

标签: mysql sql function loops case

我有以下SQL语句:

DECLARE @time datetime;       
SELECT @time = (select min(CreationDate) from TABLE);

DECLARE @time2 int;       
SELECT @time2 = 15;

select ColumnA, 
(case when CreationDate between @time and DATEADD(MINUTE,@time2***1**,@time) 
          then cast (@time2*1 as int)
      when CreationDate between @time and DATEADD(MINUTE,@time2***2**,@time) 
          then cast (@time2*2 as int)
      when CreationDate between @time and DATEADD(MINUTE,@time2***3**,@time) 
          then cast (@time2*3 as int)
      when CreationDate between @time and DATEADD(MINUTE,@time2***4**,@time) 
          then cast (@time2*4 as int)
      else 0
end) as 'interval', count(1)
from TABLE
 group by 
ColumnA, 
(case when CreationDate between @time and DATEADD(MINUTE,@time2***1**,@time) 
          then cast (@time2*1 as int)
      when CreationDate between @time and DATEADD(MINUTE,@time2***2**,@time) 
          then cast (@time2*2 as int)
      when CreationDate between @time and DATEADD(MINUTE,@time2***3**,@time) 
          then cast (@time2*3 as int)
      when CreationDate between @time and DATEADD(MINUTE,@time2***4**,@time) 
          then cast (@time2*4 as int)
      else 0
end)
  1. 如何在循环中编写case语句,以便粗体数字将成为参数 2.i需要循环/函数根据Q.1中的参数根据需要编写多个case行。
  2. 非常感谢!

    大家好,

    感谢您的回复和评论。 我意识到也许我没有正确解释我的问题。让我再说一遍我的问题。

    我有一个ETL进程,它运行并填充一个表,该表由名为" ColumnA"的列组成。其中显示了代码和创建时间列,名为" CreationDate"。 我想将结果除以创建时间。有时需要15分钟,有时需要20分钟或任何其他时间间隔。 所以我建立了一个名为" @ time"的变量。那说什么是间隔长度。 第一个问题:我不知道ETL过程会运行多长时间,因此我不知道在CASE语句中要生成多少行。 第二个问题:CASE语句行的数量还取决于我在变量" @ time"中选择的区间长度。也就是说,如果这个过程需要一个小时,那么" @ time"选定的时间间隔是15分钟然后我必须产生4个CASE语句行,但如果我选择" @ time"到10分钟然后我必须产生6个CASE声明行...... 我可以用参数做什么?

    提前感谢您的时间和精力。 问候, 艾伦B.

1 个答案:

答案 0 :(得分:0)

使用SQL时不要考虑循环。想想你想看到的结果。

如果我正确解释您的请求,您将选择具有给定@time和下一小时之间的创建日期的所有行。对于这些,您可以确定时间片。在你的情况下,它是15分钟,你想知道,创建日期是在前15分钟内(然后你输出15),或第二(然后你输出30),依此类推。带有另一个创建日期的记录,无论是在相关小时之前还是之后,都会得到输出0。

所以唯一的问题是要找到正确的公式,或多或少:得到时间差(以分钟为单位)除以分钟切片,得到的完整整数将告诉你它是哪个切片,从0开始一小时内的第一片。

应该或多或少:

select columna, interval_end_minute, count(*)
from
(
  select
    columna,
    case when creationdate >= @time and creationdate < dateadd(hour,1,@time) then
      (truncate((time_to_sec(datediff(creationdate, @time)) / 60) / @time2, 0) + 1) * @time2
    else 
      0
    end as interval_end_minute
  from table
) data
group by columna, interval_end_minute;