sql server中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 > 30
GROUP BY CategoryID
ORDER BY CategoryID DESC
这个语句查询出,所有产品分类的产品平均单价,单价计数。并且单价在 30 以上的记录。
2、再看看这种语法,如下:
Select CategoryID, AVG(DISTINCT UnitPrice), COUNT(DISTINCT UnitPrice) 
FROM dbo.Products Where UnitPrice > 30
GROUP BY CategoryID
ORDER BY CategoryID DESC
使用 DISTINCT 的时候,将会去除重复的价格平均单价。
3、如果希望在分类统计之后,再使用条件过滤,下面的语句可以做为参数:
Select CategoryID, SUM(UnitPrice) AS SumPrice
FROM dbo.Products
GROUP BY CategoryID
HAVING SUM(UnitPrice) > 300
HAVING 与 Where 语句类似,Where 是在分类之前过滤,而 HAVING 是在分类之后过滤。
它和 Where 一样使用 AND、OR、NOT、LIKE 组合使用。
4、如果希望再在分类统计中,添加汇总行,可以使用以下语句:
Select CategoryID, SUM(UnitPrice), GROUPING(CategoryID) AS 'Grouping'
FROM dbo.Products
GROUP BY CategoryID WITH ROLLUP
Grouping 这一列用于标识出哪一行是汇总行。
它使用 ROLLUP 操作添加汇总行。
5、如果使用 WITH CUBE 将会产生一个多维分类数据集,如下:
Select CategoryID, SupplierID, SUM(UnitPrice) AS SumPrice
FROM dbo.Products
GROUP 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 QtySum
FROM dbo.Products
GROUP BY SupplierID WITH CUBE
它首先检查当前行是否为汇总行,如果是就可以设置一个值,这里设置为 '-1' 。
 
### 回答1: SQL Server没有内置的group_concat函数,但可以使用STUFF和FOR XML PATH来模拟它。例如: SELECT category, STUFF((SELECT ', ' + product_name FROM products WHERE category_id = categories.category_id FOR XML PATH('')), 1, 2, '') AS products FROM categories 这将返回每个类别及其产品名称,以逗号分隔。 ### 回答2: SQL Server并不直接提供像MySQLgroup_concat聚合函数,但可以通过使用FOR XML PATH和STUFF函数来实现类似的功能。 FOR XML PATH函数可以将常规的查询结果转换为XML格式,并使用指定的路径(Path)将多个行合并到一个单一元素。STUFF函数可用于替换字符串的一部分,将几个行的文本连接成单个字符串值。 假设我们有以下表结构: CREATE TABLE Product ( ProductID INT PRIMARY KEY, ProductName VARCHAR(50), Category VARCHAR(20) ); 并使用以下示例数据: INSERT INTO Product (ProductID, ProductName, Category) VALUES (1, 'Apple', 'Fruit'), (2, 'Orange', 'Fruit'), (3, 'Carrot', 'Vegetable'), (4, 'Broccoli', 'Vegetable'); 如果要按类别对产品进行分组,并在每个类别下使用逗号分隔的产品名称列表显示结果,则可以使用以下SQL语句: SELECT Category, STUFF((SELECT ', ' + ProductName FROM Product WHERE Category = p.Category FOR XML PATH ('')), 1, 2, '') AS ProductList FROM Product p GROUP BY Category; 该查询将返回以下结果: Category ProductList Fruit Apple, Orange Vegetable Carrot, Broccoli 在该查询,内部SELECT语句使用FOR XML PATH ('')将每个产品名称转换为XML元素,并使用逗号分隔符将所有元素连接在一起。然后,使用STUFF函数将逗号和空格字符(','和' ')替换为一个空字符串,以便删除开头的空格和逗号。 总体而言,虽然SQL Server不直接支持group_concat,但是可以通过使用FOR XML PATH和STUFF函数来实现此类功能。 ### 回答3: SQL Server并没有内建的group_concat函数,但是有两种方法可以实现类似group_concat功能的操作。 方法一:使用COALESCE和FOR XML PATH组合 通过使用COALESCE和FOR XML PATH来将多行合并到同一行,从而模拟group_concat操作。具体实现如下: ``` SELECT t1.department_name, COALESCE( (SELECT employee_name + ', ' FROM employees WHERE department_id = t1.department_id ORDER BY employee_name FOR XML PATH('') ), '') AS employee_list FROM departments t1 GROUP BY t1.department_name, t1.department_id; ``` 该查询会将每个department包含的employee_name合并到同一行,通过逗号将各个employee_name隔开。 方法二:使用自定义的聚合函数 通过定义自定义的聚合函数,可以在SQL Server实现更加简便的group_concat操作。实现自定义聚合函数的具体步骤如下: 1. 创建CLR函数 CLR函数是指使用.NET Framework编写的扩展SQL Server的函数。创建CLR函数需要在Visual Studio创建一个CLR库项目,编写并编译CLR代码。 需要定义一个继承自System.Data.SqlClient.SqlAggregator类的类,并实现Update和Terminate方法,通过这两个方法来实现累加器和聚合操作。Update方法用于在聚合期间在结果集上处理行,并将数据保存在对象内。Terminate方法是在所有输入行结束后触发的,并返回最终值。 可以参考下面的代码实现: using System; using System.Data.SqlTypes; using System.IO; using System.Text; namespace MyDatabase { [Serializable] public sealed class ConcatAggregator : Microsoft.SqlServer.Server.SqlAggregator { private StringBuilder sb; public override void Init() { sb = new StringBuilder(); } public override void Accumulate(SqlString value) { if (!value.IsNull) { if (sb.Length > 0) { sb.Append(", "); } sb.Append(value.Value); } } public override SqlString Terminate() { return (sb == null ? SqlString.Null : new SqlString(sb.ToString())); } public override void Read(BinaryReader reader) { sb = new StringBuilder(reader.ReadString()); } public override void Write(BinaryWriter writer) { writer.Write(sb.ToString()); } } } 2. 将CLR库添加到SQL Server上 将CLR库添加到SQL Server需要先在SQL Server上启用CLR功能,然后通过CREATE AGGREGATE语句创建一个新的聚合函数。下面是CREATE AGGREGATE语句的示例: CREATE AGGREGATE dbo.Concatenate (@input NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) EXTERNAL NAME MyDatabase.ConcatAggregator; 3. 使用自定义聚合函数 当自定义的聚合函数定义完成之后,可以在SQL Server查询调用它。具体实现如下: SELECT department_name, dbo.Concatenate(employee_name) AS employee_list FROM departments JOIN employees ON departments.department_id = employees.department_id GROUP BY department_name; 该查询将department_name和包括相应employee_name的employee_list连接起来,并返回结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值