2013-02-08 80 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