日期:2014-05-18  浏览次数:20334 次

“Group By”和常用函数,疑问
“Group By”聚合函数应该怎样使?

实际问题一:
  select w.MeterNo,w.DATime,m.MeterName,m.buildingNo from WarnUseEnergy w left join Meter m on w.MeterNo=m.MeterNo where DATime>'2012-04-01' group by w.MeterNo

这一句“SQL”语句想让其根据“w.MeterNo”分组,“Group by”后面应该写那些字段?
是不是像下面这样,把“Select w.MeterNo”去掉,然后“group by w.MeterNo,w.DATime,m.MeterName,m.buildingNo ”,如下:
  select w.DATime,m.MeterName,m.buildingNo from WarnUseEnergy w left join Meter m on w.MeterNo=m.MeterNo where DATime>'2012-04-01' group by w.MeterNo,w.DATime,m.MeterName,m.buildingNo

  问题二: 如果想看“Select w.MeterNo” 又想按其分组应该怎么办?

问题三:SQL中的常用函数都有那些,有没有相关的资料方便查阅的?



------解决方案--------------------
实际问题一:(你没有聚合函数,这个分组统计没有实际意义)

select w.MeterNo,w.DATime,m.MeterName,m.buildingNo 
from WarnUseEnergy w left join Meter m 
on w.MeterNo=m.MeterNo 
where DATime>'2012-04-01' 
group by w.MeterNo,w.DATime,m.MeterName,m.buildingNo

问题二: 如果想看“Select w.MeterNo” 又想按其分组应该怎么办?
不知道你问的是不是这个意思:
select max(w.MeterNo),w.DATime,m.MeterName,m.buildingNo 
from WarnUseEnergy w left join Meter m 
on w.MeterNo=m.MeterNo 
where DATime>'2012-04-01' 
group by w.DATime,m.MeterName,m.buildingNo

select min(w.MeterNo),w.DATime,m.MeterName,m.buildingNo 
from WarnUseEnergy w left join Meter m 
on w.MeterNo=m.MeterNo 
where DATime>'2012-04-01' 
group by w.DATime,m.MeterName,m.buildingNo

select count(w.MeterNo),w.DATime,m.MeterName,m.buildingNo 
from WarnUseEnergy w left join Meter m 
on w.MeterNo=m.MeterNo 
where DATime>'2012-04-01' 
group by w.DATime,m.MeterName,m.buildingNo

select avg(w.MeterNo),w.DATime,m.MeterName,m.buildingNo 
from WarnUseEnergy w left join Meter m 
on w.MeterNo=m.MeterNo 
where DATime>'2012-04-01' 
group by w.DATime,m.MeterName,m.buildingNo

还是如下的意思?
SQL code

--按某一字段分组取最大(小)值所在行的数据
--(爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-10-23于浙江杭州)
/*
数据如下:
name val memo
a    2   a2(a的第二个值)
a    1   a1--a的第一个值
a    3   a3:a的第三个值
b    1   b1--b的第一个值
b    3   b3:b的第三个值
b    2   b2b2b2b2
b    4   b4b4
b    5   b5b5b5b5b5
*/
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a',    2,   'a2(a的第二个值)')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    3,   'a3:a的第三个值')
insert into tb values('b',    1,   'b1--b的第一个值')
insert into tb values('b',    3,   'b3:b的第三个值')
insert into tb values('b',    2,   'b2b2b2b2')
insert into tb values('b',    4,   'b4b4')
insert into tb values('b',    5,   'b5b5b5b5b5')
go

--一、按name分组取val最大的值所在行的数据。
--方法1:
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
--方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name
/*
name       val         memo                 
---------- ----------- -------------------- 
a          3           a3:a的第三个值
b          5           b5b5b5b5b5
*/

--二、按name分组取val最小的值所在行的数据。
--方法1:
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
--方法3:
select a.* from tb a,(select name,min(val) val from tb group by