2012-04-20 60 views
2

我需要運行一個巨大的查詢,總結一列的選項。我想知道是否有可能做一些這樣的:帶有可選聚合和組的SQL查詢可能嗎?

declare @sumIt bit 
set @sumIt = 1 

select ID, Name, CASE WHEN @sumIt=1 THEN sum(Time) ELSE Time END [timeCol]  
from Visits 
where ID = 123 
Group by ID, Name, CASE WHEN @sumIt=1 THEN '' ELSE Time END 

現在我得到一個錯誤: 消息8120,級別16,狀態1,行4列 「Visits.Time」被在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。

+0

訪問中您的唯一標識符是什麼? – 2012-04-20 18:01:39

+0

@JohnDewey - 在這個查詢中,我的唯一標識符不被檢索 – lauh 2012-04-20 19:11:31

回答

2

我認爲你可以做到以下幾點:

declare @sumIt bit 
set @sumIt = 1 

select ID, Name, 
     (CASE WHEN @sumIt=1 THEN sum(Time) ELSE min(Time) END) [timeCol] 
from Visits 
where ID = 123 
Group by ID, Name, (CASE WHEN @sumIt=1 THEN '' ELSE Time END) 

您可以通過變量應用聚合函數的組。這不常用,但它解決了你的問題。

+0

謝謝,這是有效的......我猜是否實際做到這一點仍然是個問題。我有一個超過150行的查詢,我不想重複以容納這一功能,但也許爲了我應該採取的最佳做法。 – lauh 2012-04-20 19:24:17

+0

順便說一句,我需要改變你的例子從「然後」「」稍微「,然後在集團子句中」然後null「以處理我的情況。 – lauh 2012-04-20 19:31:06

0

我沒有測試過,但是這個應該很好地工作:

select ID, Name, sum([Time]) [timeCol] 
from Visits 
where ID = 123 
AND @sumint = 1 
Group by ID, Name 
UNION ALL 
select ID, Name, [Time] [timeCol] 
from Visits 
where ID = 123 
AND @sumint = 0 
Group by ID, Name, [Time] 
+0

我認爲問題在於他不想維護兩次巨大的查詢。這並沒有真正解決它,但老實說,我想不出一個更好的方法。 – climbage 2012-04-20 17:24:46

0

我想你可以把動態SQL方法。不是瘋了一下我自己,我只是使用IF

declare @sumIt bit, @sql VARCHAR(1000) 
set @sumIt = 0 

SET @sql = 'select ID, Name, ' + CASE WHEN @sumIt=1 THEN 'sum(Time)' ELSE 'Time' END + ' [timeCol] 
from Visits 
where ID = 123 
Group by ID, Name' + CASE WHEN @sumIt=1 THEN '' ELSE ',Time' END 

EXEC @sql 
+0

我會在任何一天選擇通過字符串連接SQL的兩個單獨的查詢。 – HardCode 2012-04-20 19:13:09