【问题标题】:MSSQL 2005 function on MSSQL 2000: GROUP BY CAST(...) troubleMSSQL 2000 上的 MSSQL 2005 函数:GROUP BY CAST(...) 麻烦
【发布时间】:2013-01-24 07:13:24
【问题描述】:

我写了一个函数来统计汇总表的记录。此功能在 MSSQL 2005 下运行良好:

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 region 似乎是错误的:

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

有人可以帮我吗?

【问题讨论】:

  • 手边没有 2000 个可供测试。 GROUP BY CAST(FLOOR(ISNULL(col1, col2) / 50) * 50 AS INT), CAST(FLOOR(ISNULL(col1, col2) / 50) * 50 AS INT) + 49 有效吗?也许 2000 没有逻辑来检测按第一个和第二个分组是相同的分组。
  • 谢谢你,马丁!效果很好!

标签: sql sql-server sql-server-2005 casting group-by


【解决方案1】:

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

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

这也使查询更容易理解。

【讨论】:

  • 子查询中最好有WHERE子句还是没关系?
  • @msmucker0527 。 . .没关系。 (体面的)SQL 引擎实际上并不将子查询实例化为表。它只是描述正在进行的处理。添加列时,没有问题。如果有聚合,最好在大多数数据库的子查询中包含where
  • @Panschi11291:t(在) 之后)是派生表(子选择)的别名。派生表在 SQL Server 中必须有别名。
  • @GordonLinoff 在这种情况下,“t”是我的表“T”的别名吗?我试试看!
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2010-10-21
  • 2010-10-15
相关资源
最近更新 更多