2012-04-20 61 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