2011-03-22 187 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

相關問題