2011-03-22 188 views
0

使用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为空即可。

+0

为什么你使用'(24/1)',而不仅仅是'24'? – 2011-03-22 15:16:57

+0

它实际上是24/@nIntervals,但我替换它为示例,因为我不想定义我使用的变量时,我可以显式地填写值。 – Mike 2011-03-22 15:37:03

+0

我现在看到了,谢谢。 – 2011-03-22 15:52:06

回答

2

更改组通过为:

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), 
    Case @Id When Null Then 0 Else Id End 

果然不出我所编辑的这,但不会单独工作是:

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), 
    @Id 

- 无论这些本身会导致一个错误,因为中的select语句不在Group By中。这两者都可以通过与集团选择相一致correctted通过

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, 
     Case @Id When Null Then 0 Else Id End Id, 
     COUNT(*) as nVisits 
    FROM dbo.Table1 v 
     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), 
    Case @Id When Null Then 0 Else Id End 

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, 
     @Id Id, COUNT(*) as nVisits 
    FROM dbo.Table1 v 
     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), 
    @Id 
+0

你可以请回到以前的编辑,以便我可以接受答案吗?终于为我工作的是'用CASE替换v.ID的两个实例当@id IS NULL THEN 0 ELSE v.ID END' – Mike 2011-03-22 14:48:54

2

GROUP BY @id,而不是GROUP BY v.id,并且在SELECT语句替换v.id@id

+0

在附注中,'ORDER BY 2,3,4'在SQL Server中有效吗?我以为没有? (在那里,是按字段2,3和4排序,还是按照常数整数值来解释2,3,4?) – MatBailie 2011-03-22 14:31:59

+0

是的,我在sqlserver中工作的顺序,我尝试将它更改为@id但收到错误消息: 每个GROUP BY表达式都必须包含至少一个不是外部引用的列。 – Mike 2011-03-22 14:32:52

+0

您在SELECT和GROUP BY语句中将'v.ID'实例更改为'@ id',并且更改了其他任何内容? – MatBailie 2011-03-22 14:35:13

相关问题