2013-02-08 50 views
1

我已经写了一个统计表总结表记录的函数。这个函数MSSQL 2005下正常工作:MSSQL 2000上的MSSQL 2005函数:GROUP BY CAST(...)问题

DECLARE 
@start datetime, 
@final datetime, 

SET @start = '08.02.2012' 
SET @final = '08.02.2013' 

SELECT 
    CAST(
     FLOOR(ISNULL(col1,col2)/50) * 50 AS int 
    ) AS [MyCol1], 
    CAST(
     FLOOR(ISNULL(col1,col2)/50) * 50 AS int 
    )+49 AS [MyCol2],  

COUNT(*) AS [Anzahl], 
CAST(AVG(col3) AS decimal(3,2)) AS [MyCol3] 
FROM T 
WHERE Time BETWEEN @start AND @final 
GROUP BY 
    CAST(
    FLOOR(ISNULL(col1,col2)/50) * 50 AS INT 
) 
ORDER BY 1 

现在我想在MSSQL使用此功能2000个系统,但本集团按区域似有不妥:

列在无效选择列表,因为它不包含在合计 函数和GROUP BY子句中。

有人能帮助我吗?

+1

没有2000个方便测试。 'GROUP BY CAST(FLOOR(ISNULL(col1,col2)/ 50)* 50 AS INT),CAST(FLOOR(ISNULL(col1,col2)/ 50)* 50 AS INT)+ 49'是否工作?也许2000没有逻辑来检测第一个分组,而第二个分组是相同的。 – 2013-02-08 13:50:16

+0

谢谢你,马丁! 它工作正常! – Panschi11291 2013-02-08 13:57:03

回答

2

解决这个最简单的方法是使用子查询:

SELECT [MyCol1], [MyCol1]+49 AS [MyCol2], COUNT(*) AS [Anzahl], 
     CAST(AVG(col3) AS decimal(3,2)) AS [MyCol3] 
FROM (select t.*, CAST(FLOOR(ISNULL(col1,col2)/50) * 50 AS INT) as [MyCol1] 
     from T 
    ) t 
WHERE Time BETWEEN @start AND @final 
GROUP BY [MyCol1] 
ORDER BY 1 

这也使得查询更容易理解。

+0

最好在子查询中使用WHERE子句还是没有关系? – msmucker0527 2013-02-08 14:25:44

+1

@ msmucker0527。 。 。这应该不重要。 (体面)SQL引擎并不实际将子查询实例化为表。它只是描述正在完成的处理。添加列时,没有问题。如果有聚合,最好在大多数数据库的子查询中使用“where”。 – 2013-02-08 14:28:18

+0

@ Panschi11291:''t'(在'''''后面)是派生表的别名(subselect)。派生表必须在SQL Server中有别名。 – 2013-02-08 14:29:45