IDINT,
otherID INT,
keyID INT,
weekName VARCHAR(20),
weekName2 VARCHAR(20),
Num1 INT,
Num2 INT
)
INSERT INTO #temp
SELECT 1, 19, 0, '星期日', '星期日', 0, 0 UNION ALL
SELECT 2, 19, 1, '星期一', '星期一', 0, 0 UNION ALL
SELECT 3, 19, 1, '星期二', '星期二', 0, 0 UNION ALL
SELECT 4, 19, 1, '星期三', '星期三', 0, 0 UNION ALL
SELECT 5, 19, 1, '星期四', '星期四', 0, 0 UNION ALL
SELECT 6, 19, 0, '星期五', '星期五', 0, 0 UNION ALL
SELECT 7, 19, 0, '星期六', '星期六', 0, 0 UNION ALL
SELECT 8, 20, 0, '星期日', '星期日', 0, 0
SELECT
ID,
otherID,
keyID,
weekName,
weekName2,
Num1,
Num2,
0 AS OrderByFlag
FROM
#temp
UNION ALL
SELECT
0 AS id,
otherID,
keyID,
'小计',
'小计',
SUM(Num1),
SUM(Num2),
1 AS OrderByFlag
FROM
#temp
GROUP BY
otherID,
keyID
ORDER BY
otherID, OrderByFlag
ID otherID keyID weekName weekName2Num1Num2OrderByFlag
----------- ----------- ----------- -------------------- -------------------- ----------- ----------- -----------
1 19 0 星期日 星期日 0 0 0
2 19 1 星期一 星期一 0 0 0
3 19 1 星期二 星期二 0 0 0
4 19 1 星期三 星期三 0 0 0
5 19 1 星期四 星期四 0 0 0
6 19 0 星期五 星期五 0 0 0
7 19 0 星期六 星期六 0 0 0
0 19 0 小计 小计 0 0 1
0 19 1 小计 小计 0 0 1
8 20 0 星期日 星期日 0 0 0
0 20 0 小计 小计 0 0 1
(11 行受影响)
多 SELECT 了一个 OrderByFlag 用于排序。
语法SELECT 字段表FROM 表WHERE标准[GROUP BY 分组字段表]Group by 是SQL Server 中常用的一种语法,语法如下:[ GROUP BY [ ALL ] group_by_expression [ ,...n ][ WITH { CUBE | ROLLUP } ]]1、最常用的就是这种语法,如下:Select CategoryID, AVG(UnitPrice), COUNT(UnitPrice) FROM dbo.Products Where UnitPrice >30GROUP BY CategoryID ORDER BY CategoryID DESC这个语句查询出,所有产品分类的产品平均单价,单价计数。并且单价在 30 以上的记录。
2、再看看这种语法,如下:Select CategoryID, AVG(DISTINCT UnitPrice), COUNT(DISTINCT UnitPrice) FROM dbo.Products Where UnitPrice >30GROUP BY CategoryID ORDER BY CategoryID DESC使用 DISTINCT 的时候,将会去除重复的价格平均单价。
3、如果希望在分类统计之后,再使用条件过滤,下面的语句可以做为参数:Select CategoryID, SUM(UnitPrice) AS SumPriceFROM dbo.ProductsGROUP BY CategoryIDHAVING SUM(UnitPrice) >300HAVING 与 Where 语句类似,Where 是在分类之前过滤,而 HAVING 是在分类之后过滤。它和 Where 一样使用 AND、OR、NOT、LIKE 组合使用。
4、如果希望再在分类统计中,添加汇总行,可以使用以下语句:Select CategoryID, SUM(UnitPrice), GROUPING(CategoryID) AS 'Grouping'FROM dbo.ProductsGROUP BY CategoryID WITH ROLLUPGrouping 这一列用于标识出哪一行是汇总行。它使用 ROLLUP *** 作添加汇总行。
5、如果使用 WITH CUBE 将会产生一个多维分类数据集,如下:Select CategoryID, SupplierID, SUM(UnitPrice) AS SumPriceFROM dbo.ProductsGROUP BY CategoryID, SupplierID WITH CUBE 它会产生一个交叉表,产生所有可能的组合汇总。
6、使用 ROLLUP CUBE 会产生一个 NULL 空值,可以使用以下语法解决,如下:Select CASE WHEN (GROUPING(SupplierID) = 1) THEN '-1'ELSE SupplierID END AS SupplierID, SUM(UnitPrice) AS QtySumFROM dbo.ProductsGROUP BY SupplierID WITH CUBE
它首先检查当前行是否为汇总行,如果是就可以设置一个值,这里设置为 '-1' 。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)