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
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
------解决方案--------------------
这样呢:
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