使用SQLServer的2008是否可以在select/group by语句中使用if子句?还是另一种解决方案
目前,我有如下图所示(虽然有在我刚刚填写他们在这里给什么样的投入可能是一个更好的主意函数变量)实现的功能的功能。
我想知道是否有一种方法,当你定义为如果你没有通过的条款选择/组中定义它@id
为空值(目前在合并上v.ID使用)来匹配一切吗?
SELECT
'ALL' as GeogType,
CAST(v.AdmissionOn as date) as dtAdmission,
(DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) as timeInterval,
CAST((DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1) as nvarchar) + ':00' as fromTime,
CAST((DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1) + (24/1) as nvarchar) + ':00' as toTime,
v.ID,
COUNT(*) as nVisits
FROM dbo.Table1 v INNER JOIN dbo.Table2 t ON v.FSLDU = t.FSLDU5
WHERE v.AdmissionOn >= '01-01-2010' AND v.AdmissionOn < DATEADD(day,1,'02-01-2010')
AND v.ID = Coalesce(@id,ID)
GROUP BY
CAST(v.AdmissionOn as date),
(DATEPART(hour,CAST(AdmissionOn as time)))/(24/1),
(DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1),
(DATEPART(hour,CAST(AdmissionOn as time)))/(24/1) * (24/1) + (24/1),
v.ID
ORDER BY 2,3,4
它将返回设置类似这样的结果,当@id
为空:
ALL 2010-01-01 0 0:00 24:00 7 4
ALL 2010-01-01 0 0:00 24:00 4 54
ALL 2010-01-01 0 0:00 24:00 0 2303
ALL 2010-01-01 0 0:00 24:00 3 412
ALL 2010-01-01 0 0:00 24:00 6 57
ALL 2010-01-01 0 0:00 24:00 2 64
ALL 2010-01-01 0 0:00 24:00 5 5
ALL 2010-01-01 0 0:00 24:00 1 103
但我想它改为:
ALL 2010-01-01 0 0:00 24:00 ? 3002
我不知道是什么会去?列,可能类似于1,2,3,4,5,6,7?
这是否可以通过诸如select/group by子句或我不知道的存储过程之类的事情来完成?如果没有,我可以创建一个新的函数,但我希望只需输入@id
为空即可。
为什么你使用'(24/1)',而不仅仅是'24'? – 2011-03-22 15:16:57
它实际上是24/@nIntervals,但我替换它为示例,因为我不想定义我使用的变量时,我可以显式地填写值。 – Mike 2011-03-22 15:37:03
我现在看到了,谢谢。 – 2011-03-22 15:52:06