日期:2014-05-16  浏览次数:20469 次

能否针对某一字段进行group by分组查询
本帖最后由 lazygc520 于 2014-02-26 10:34:18 编辑

select a.id,b.cust_no,b.type,b.lotno,convert(varchar(10),check_time,120) 
as date from stock_check as a,sys_barcode_1d_y as b where a.packageno = 
b.packageno and check_time >= '2014-02-18 08:00:00' AND check_time <= 
'2014-02-18 20:00:00' group by a.id,b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc


现在想要用这个结果集针对lotno这项进行分组查询并保持原有输出字段不变,sql语句怎么修改?
------解决方案--------------------
sum/max/min....()over(partition by lotno)
------解决方案--------------------
Over子句
over子句用于为行定义一个窗口,以便进行特定的运算,可以把行的窗口简单的认为是运算将要操作的一个行的集合,
例如,聚合函数和排名函数都是可以支持Over子句的运算类型.
由于Over子句为这些函数提供了一个行的窗口,所以这些函数也称之为开窗函数.
注意:只有在Select和Order by处理阶段才允许使用Over子句.
例如
select orderid,custid,val,
SUM(val) over() as totalvalue,
SUM(val) over(partition by custid)as custtotalvalue
from Sales.OrderValues
如果查询在select阶段之前没有过滤数据,也没有其他相应的逻辑阶段,这个表达式将返回ordervalues视图中的所有行的总价格
如果想对行进行限制或分区,则可以使用partition by 子句,例如不想返回ordervalues中所有行的总价格,而只是想返回当前客户
(和当前行具有相同custid的所有行)的总价格,则可以指定    SUM(val) Over(partition by custId)




Over子句的一个优点是能够在返回基本列的同时,在同一行对它们进行聚合,也可以在表达式中混合使用
基本列和聚合值列
例如:以下查询为OrderValues的每一行计算当前价格占总价格的百分比,以及当前价格占客户总价格的百分比
select orderid,custid,val,100.*val/SUM(val) over() as pctall,
100.*val/sum(val) over(partition by custid) as pctcust
from Sales.OrderValues

注意:在表达式中使用的是十进制实数 100.(100后面加个点),而不是直接使用整数100,因为这样可以隐式地将整数值val和sum(val)转换成十进制实数值,
否则表达式的除法将是"整数除法",会截去数值的小数部分.

Over子句也支持四种排名函数,Row_Number(行号),Rank(排名),DENSE_RANK(密集排名),以及NTILE

select orderid,custid,val,ROW_NUMBER() over(order by val) as rownum,
RANK() over(order by val) as rank,
DENSE_RANK() over (order by val) as dense_rank,
NTILE(100) over(order by val) as ntile 
from Sales.OrderValues
order by val





------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

你的意思是,语句最后只有3行?


类似下面:
8295 12653627 ABH6 4037 84 2014/2/18
8121 12654172 ABJT 4041 1746 2014/2/18
8284 12654172 ABJT 4042 750 2014/2/18

应该是这样的结果。


哦 ,那这个:

8291 12653627 ABH6 4037 84 2014/2/18
8292 12653627 ABH6 4037 84 2014/2/18
8293 12653627 ABH6 4037 84 2014/2/18
8294 12653627 ABH6 4037 84 2014/2/18
8295 12653627 ABH6 4037 84 2014/2/18
8296 12653627 ABH6 4037 84 2014/2/18

怎么就变成了一条呢:
8295 12653627 ABH6 4037 84 2014/2/18

那id为什么取:8295 呢,而不是8291,8292呢


我只是举个例子,具体id多少我是不知道的。


这样呢:
select max(a.id) as id,b.cust_no,b.type,b.lotno,count(b.lotno)) over(partition by lotno),
convert(varchar(10),check_time,120) 
as date from stock_check as a,sys_barcode_1d_y a