Select CategoryID, AVG(UnitPrice), COUNT(UnitPrice) FROMdbo.Products Where UnitPrice > 30GROUP BY CategoryIDORDER BY CategoryID DESC
这个语句查询出,所有产品分类的产品平均单价,单价计数。并且单价在 30 以上的记录。
2、再看看这种语法,如下:
Select CategoryID, AVG(DISTINCT UnitPrice), COUNT(DISTINCTUnitPrice) FROM dbo.Products Where UnitPrice >30GROUP BY CategoryID ORDER BY CategoryID DESC
使用 DISTINCT 的时候,将会去除重复的价格平均单价。
3、如果希望在分类统计之后,再使用条件过滤,下面的语句可以做为参数:Select CategoryID, SUM(UnitPrice)AS SumPriceFROM dbo.ProductsGROUP BY CategoryIDHAVINGSUM(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 ROLLUP
Grouping 这一列用于标识出哪一行是汇总行。它使用 ROLLUP 操作添加汇总行。
5、如果使用 WITH CUBE 将会产生一个多维分类数据集,如下:
Select CategoryID, SupplierID, SUM(UnitPrice) AS SumPriceFROMdbo.ProductsGROUP BY CategoryID, SupplierID WITH CUBE
它会产生一个交叉表,产生所有可能的组合汇总。
6、使用 ROLLUP CUBE 会产生一个 NULL 空值,可以使用以下语法解决,如下:
Select CASE WHEN (GROUPING(SupplierID) = 1) THEN'-1'ELSESupplierIDEND ASSupplierID,SUM(UnitPrice) AS QtySumFROM dbo.ProductsGROUP BY SupplierID WITHCUBE它首先检查当前行是否为汇总行,如果是就可以设置一个值,这里设置为 '-1' 。
5、group by 后面有两个列来控制分组
select 职工号 ,count(*) as 总数 from 订购单
group by 职工号 ,供应商号
group by 后面有两个列来控制分组顺序是,先按职工号进行分组,然后再看供应商号,如果此时供应商号也相同时,这两条记录才是一组
6、group by 分组条件的限制
select 职工.仓库号, 城市
from 职工,仓库
where 仓库.仓库号=职工.仓库号
group by 仓库.仓库号 意图是想突破这个分组条件的限制,想把列扩展一些,失败!!!主要是想分组后,再去和别的关系去连接,以使用到其他关系的字段,但失败!!!!!
分析原因:假如以上的操作可以成功的话,如果是以一个"不可能为主键列为分组的条件,如性别"得到结果,再去和其他的关系去联系,存在1:n的关系
//////////////////////////////////////////////////////////////////////////////////////////////////////
select 仓库号,城市 from 仓库
where 仓库号 in(select 仓库号
from 职工
group by 仓库号 此时依然无法摆脱这个分组的限制
)
////////////////////////////////////////////////////////////////////////////////////////
select 职工.仓库号,城市,count(*) from 职工, 仓库
where 职工.仓库号=仓库.仓库号
group by 职工.仓库号,仓库.城市 为这个子句添加一个列,就可以去投影了!!!!这样就实现了以上的想法