SQL中GROUP BY的用法

  • 格式:doc
  • 大小:433.00 KB
  • 文档页数:16

SQL中GROUP BY的用法及常用聚合函数

问:select item.itemnum,item.in1,item.in4,inventory.location from

item,inventory where item.itemnum=inventory.itemnum and

inventory.location='DYB' and item.in1='D/MTD/MRM' GROUP BY ITEM.ITEMNUM

提示错误是NOT A GROUP BY EXPRESSION

那位高人能指点一下是我是那里出错了,还有GROUP BY的用法

谢谢了哈!

答:

GROUP BY 是分组查询, 一般 GROUP BY是和 聚合函数配合使用,你可以想想,你用了GROUP BY 按 ITEM.ITEMNUM 这个字段分组,那其他字段内容不同,变成一对多又改如何显示呢,比如下面所示

A B

1 bc

1 bcd

1 asdfg

select A,B from table group by A

你说这样查出来是什么结果,

A B

abc

bcd

sdfg

右边3条如何变成一条,所以需要用到聚合函数,比如

select A,count(B) 数量 from table group by A

这样的结果就是

A 数量

3

group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。

常用的聚合函数

AVG

AVG聚合函数计算一个组中非NULL值的平均值

COUNT

COUNT聚合函数返回一个显示组中行数的整数值

COUNT_BIG

和COUNT功能一样,只是COUNT_BIG返回bigint数据类型值

MAX

MAX聚合函数返回一组非NULL值中的最大值

MIN MIN聚合函数返回一组非NULL值中的最小值

SUM

SUM聚合函数返回一个表达式中所有非NULL值的总和

STDEV

STDEV函数根据数据母体的样本返回由表达式提供的所有值的标准差

STDEVP

STDEVP函数也返回由表达式提供的所有值的标准差,只是它计算整个数据母体

VAR

VAR函数根据数据母体的样本返回由表达式提供的值的方差

VARP

VARP函数也返回表达式整个数据母体提供的值的方差

聚合函数是对一组值执行计算并返回单一的值的函数,它经常与SELECT语句的GROUP BY子句一同使用,SQL SERVER 中具体有哪些聚合函数呢?我们来一一看一下:

1. AVG 返回指定组中的平均值,空值被忽略。

例:select prd_no,avg(qty) from sales group by prd_no

2. COUNT 返回指定组中项目的数量。

例:select count(prd_no) from sales

3. MAX 返回指定数据的最大值。

例:select prd_no,max(qty) from sales group by prd_no

4. MIN 返回指定数据的最小值。

例:select prd_no,min(qty) from sales group by prd_no

5. SUM 返回指定数据的和,只能用于数字列,空值被忽略。

例:select prd_no,sum(qty) from sales group by prd_no

6. COUNT_BIG 返回指定组中的项目数量,与COUNT函数不同的是COUNT_BIG返回bigint值,而COUNT返回的是int值。

例:select count_big(prd_no) from sales

7. GROUPING 产生一个附加的列,当用CUBE或ROLLUP运算符添加行时,输出值为1,当所添加的行不是由CUBE或ROLLUP产生时,输出值为0.

例:select prd_no,sum(qty),grouping(prd_no) from sales group by prd_no

with rollup

8. BINARY_CHECKSUM 返回对表中的行或表达式列表计算的二进制校验值,用于检测表中行的更改。

例:select prd_no,binary_checksum(qty) from sales group by prd_no

9. CHECKSUM_AGG 返回指定数据的校验值,空值被忽略。

例:select prd_no,checksum_agg(binary_checksum(*)) from sales group by

prd_no

10. CHECKSUM 返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引。

11. STDEV 返回给定表达式中所有值的统计标准偏差。

例:select stdev(prd_no) from sales

12. STDEVP 返回给定表达式中的所有值的填充统计标准偏差。

例:select stdevp(prd_no) from sales

13. VAR 返回给定表达式中所有值的统计方差。

例:select var(prd_no) from sales

14. VARP 返回给定表达式中所有值的填充的统计方差。

例:select varp(prd_no) from sales

SQLSERVER中union,cube,rollup,cumpute运算符使用说明

UNION 运算符是将两个或更多查询的结果组合为单个结果集

使用 UNION 组合查询的结果集有两个最基本的规则:

1.所有查询中的列数和列的顺序必须相同。

2.数据类型必须兼容

a.UNION的结果集列名与第一个select语句中的结果集中的列名相同,其他select语句的结果集列名被忽略

b.默认情况下,UNION 运算符是从结果集中删除重复行。如果使用all关键字,那么结果集将包含所有行并且不删除重复行

c.sql是从左到右对包含UNION 运算符的语句进行取值,使用括号可以改变求值顺序

例如:

select * from tablea

union all (

select * from tableb

union all

select * from tablec

)

这样就可以先对tableb和tablec合并,再合并tablea

d.如果要将合并后的结果集保存到一个新数据表中,那么into语句必须加入到第一条select中

e.只可以在最后一条select语句中使用 order by 和 compute 子句,这样影响到最终合并结果的排序和计数汇总

f.group by 和 having 子句可以在单独一个select查询中使用,它们不影响最终结果

CUBE 汇总数据

CUBE 运算符生成的结果集是多维数据集。多维数据集是事实数据的扩展,事实数据即记录个别事件的数据。

扩展建立在用户打算分析的列上。这些列被称为维。多维数据集是一个结果集,其中包含了各维度的所有可能组合的交叉表格。

CUBE 运算符在 SELECT 语句的 GROUP BY 子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。

GROUP BY 应指定维度列和关键字 WITH CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。

下列查询返回的结果集中,将包含 Item 和 Color 的所有可能组合的 Quantity

小计:

-->Title:生成測試數據

-->Author:wufeng4552

-->Date :2009-09-10 14:36:20

if not object_id('Tempdb..#t') is null

drop table #t

Go

Create table #t([Item] nvarchar(5),[Color] nvarchar(4),[Quantity] int)

Insert #t

select N'Table',N'Blue',124 union all

select N'Table',N'Red',223 union all

select N'Chair',N'Blue',101 union all

select N'Chair',N'Red',210

Go

select [Item],

[Color],

sum([Quantity])[Quantity]

from #t group by [Item],[Color] with cube

/* Item Color Quantity

----- ----- -----------

Chair Blue 101

Chair Red 210

Chair NULL 311

Table Blue 124

Table Red 223

Table NULL 347

NULL NULL 658

NULL Blue 225

NULL Red 433

*/

/*CUBE 操作所生成的空值带来一个问题:如何区分 CUBE 操作所生成的 NULL

值和从实际数据中返回的 NULL 值?

这个问题可用 GROUPING 函数解决。

如果列中的值来自事实数据,则 GROUPING 函数返回 0;如果列中的值是 CUBE

操作所生成的 NULL,则返回 1。

在 CUBE 操作中,所生成的 NULL 代表全体值。可将 SELECT 语句写成使用

GROUPING 函数将所生成的 NULL 替换为字符串 ALL。

因为事实数据中的 NULL 表明数据值未知,所以 SELECT 语句还可译码为返回字符串 UNKNOWN 替代来自事实数据的 NULL。

例如:

*/

-->Title:生成測試數據

-->Author:wufeng4552

-->Date :2009-09-10 14:36:20

if not object_id('Tempdb..#t') is null

drop table #t

Go

Create table #t([Item] nvarchar(5),[Color] nvarchar(4),[Quantity] int)

Insert #t

select N'Table',N'Blue',124 union all

select N'Table',N'Red',223 union all

select N'Chair',N'Blue',101 union all

select N'Chair',N'Red',210

Go

select [Item]=case when grouping([Item])=1 then 'ALL' else isnull(Item,

'UNKNOWN')end,

[Color]=case when grouping([Color])=1 then 'ALL' else