参考下面的代码:  

      SELECT DATEPART(ISO_WEEK,'2010-1-3') --返回53
  SELECT DATEPART(ISO_WEEK,'2010-1-4') --返回1
  SELECT DATEPART(ISO_WEEK,'2009-1-1') --返回1

  5.ROLLUP、CUBE 和GROUPING SETS

  在SQL Server 2008之前,进行分组统计汇总,可以在GROUP BY子句中使用WITH ROLLUP和WITH CUBE参数。ROLLUP指定在结果集内不仅包含由GROUP BY提供的行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。而CUBE参数则在使用ROLLUP参数所返回结果集的基础上,再将每个可能的组和子组组合在结果集内返回。

  例如,假设dbo.T1表中存在下列数据:

4

  执行下面的查询语句:  

      SELECT CustName,ProductID,SUM(Sales) AS 'SalesTotal'
  FROM dbo.T1
  GROUP BY CustName,ProductID
  WITH CUBE
  ORDER BY CustName,ProductID;
  SELECT CustName,ProductID,SUM(Sales) AS 'SalesTotal'
  FROM dbo.T1
  GROUP BY CustName,ProductID
  WITH ROLLUP
  ORDER BY CustName,ProductID;

  得到下面的结果集合,可以看出,使用WITH CUBE多出了对子组ProductID的两行汇总。 

5

而在SQL Server 2008中,GROUPING SETS、ROLLUP 和 CUBE 运算符已添加到 GROUP BY 子句中。不再推荐使用不符合 ISO 的 WITH ROLLUP、WITH CUBE 和 ALL 语法。在SQL Server 2008中,可以将上面的WITH CUBE语句改写为如下的形式: 

      SELECT CustName,ProductID,SUM(Sales) AS 'SalesTotal'
  FROM dbo.T1
  GROUP BY CUBE(CustName,ProductID)
  ORDER BY CustName,ProductID;

  如果不需要获得由完备的 ROLLUP 或 CUBE 运算符生成的全部分组,则可以使用 GROUPING SETS 仅指定所需的分组。例如,下面的语句将得到分别按CustName和ProductID分组汇总结果集的并集。 

      SELECT CustName,ProductID,SUM(Sales) AS 'SalesTotal'
  FROM dbo.T1
  GROUP BY GROUPING SETS(CustName,ProductID)
  ORDER BY CustName,ProductID;

  结果集如下: 

6

  上面的语句等同于下面的UNION ALL语句: 

      SELECT CustName,NULL AS ProductID,SUM(Sales) AS 'SalesTotal'
  FROM dbo.T1
  GROUP BY CustName
  UNION ALL
  SELECT NULL AS CustName,ProductID,SUM(Sales) AS 'SalesTotal'
  FROM dbo.T1
  GROUP BY ProductID