sql server 特殊的汇总行怎么实现

sql server 特殊的汇总行怎么实现,第1张

CREATE TABLE #temp (

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' 。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7953722.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存