能否针对某一字段进行group by分组查询

littlebirds 2014-02-26 10:20:48

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语句怎么修改?
...全文
339 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 22 楼 yupeigu 的回复:
你有qq不,方便的话,帮你看看
如果用mysql,这样能得到正确的结果:

select t.cust_no,t.type,t.lotno,count(t.lotno) as count,t.date from (select a.id,b.cust_no,b.type,b.lotno,DATE_FORMAT(check_time,'%Y-%m-%d') 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' order by b.cust_no,b.lotno asc)t group by t.lotno,t.cust_no
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 22 楼 yupeigu 的回复:
你有qq不,方便的话,帮你看看
我把数据上传下好了,这是sql查询得到的结果:

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' order by b.cust_no,b.lotno asc
数据下载地址:http://yun.baidu.com/xcloud/csdn/pan/share/link?shareid=1645611667&uk=2974027032
  • 打赏
  • 举报
回复
引用 21 楼 lazygc520 的回复:
[quote=引用 18 楼 yupeigu 的回复:] [quote=引用 16 楼 lazygc520 的回复:] [quote=引用 14 楼 yupeigu 的回复:] 这样呢:
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 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 b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc

如果改成这样的话还是不对,但是接近了,结果的第二行数据怎么产生的?

select max(a.id) as id,b.cust_no,b.type,b.lotno,sum(count(b.lotno)) 
over(partition by lotno) count,
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 b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc
结果: 8296 12653627 ABH6 4037 84 2014-02-18 8299 12653627 ABH6 4041 1746 2014-02-18 8236 12654172 ABJT 4041 1746 2014-02-18 8287 12654172 ABJT 4042 750 2014-02-18[/quote] 这样呢:

select *
from 
(
select max(a.id) as id,b.cust_no,b.type,b.lotno,
sum(count(b.lotno)) over(partition by lotno) count,
ROW_NUMBER() over(partition by b.lotno order by getdate()) rownum,
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 b.cust_no,b.type,b.lotno,convert(varchar(10),check_time,120) 
)t
where rownum = 1
order by cust_no,lotno asc
[/quote] 貌似也不对,我认真核对了下数据: 8296 12653627 ABH6 4037 84 2014-02-18 8299 12653627 ABH6 4041 51 2014-02-18 8236 12654172 ABJT 4041 1695 2014-02-18 8287 12654172 ABJT 4042 750 2014-02-18[/quote] 你有qq不,方便的话,帮你看看
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 18 楼 yupeigu 的回复:
[quote=引用 16 楼 lazygc520 的回复:] [quote=引用 14 楼 yupeigu 的回复:] 这样呢:
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 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 b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc

如果改成这样的话还是不对,但是接近了,结果的第二行数据怎么产生的?

select max(a.id) as id,b.cust_no,b.type,b.lotno,sum(count(b.lotno)) 
over(partition by lotno) count,
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 b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc
结果: 8296 12653627 ABH6 4037 84 2014-02-18 8299 12653627 ABH6 4041 1746 2014-02-18 8236 12654172 ABJT 4041 1746 2014-02-18 8287 12654172 ABJT 4042 750 2014-02-18[/quote] 这样呢:

select *
from 
(
select max(a.id) as id,b.cust_no,b.type,b.lotno,
sum(count(b.lotno)) over(partition by lotno) count,
ROW_NUMBER() over(partition by b.lotno order by getdate()) rownum,
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 b.cust_no,b.type,b.lotno,convert(varchar(10),check_time,120) 
)t
where rownum = 1
order by cust_no,lotno asc
[/quote] 貌似也不对,我认真核对了下数据: 8296 12653627 ABH6 4037 84 2014-02-18 8299 12653627 ABH6 4041 51 2014-02-18 8236 12654172 ABJT 4041 1695 2014-02-18 8287 12654172 ABJT 4042 750 2014-02-18
  • 打赏
  • 举报
回复
再改一下:
select *
from 
(
select a.id,b.cust_no,b.type,b.lotno,
sum(count(b.lotno)) over(partition by lotno) count,
ROW_NUMBER() over(partition by b.lotno order by getdate()) rownum,
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) 
)t
where rownum = 1
order by cust_no,lotno asc
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 17 楼 ap0405140 的回复:
try this,

select id,cust_no,type,lotno,qty,date
from
(select a.id,b.cust_no,b.type,b.lotno,
        count(b.lotno) over(partition by lotno) 'qty',
        convert(varchar(10),check_time,120) 'date',
        row_number() over(partition by b.lotno order by a.id desc) 'rn'
 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') t 
where t.rn=1
貌似也不对,我认真核对了下数据: 8296 12653627 ABH6 4037 84 2014-02-18 8299 12653627 ABH6 4041 51 2014-02-18 8236 12654172 ABJT 4041 1695 2014-02-18 8287 12654172 ABJT 4042 750 2014-02-18
  • 打赏
  • 举报
回复
引用 16 楼 lazygc520 的回复:
[quote=引用 14 楼 yupeigu 的回复:] 这样呢:
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 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 b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc

如果改成这样的话还是不对,但是接近了,结果的第二行数据怎么产生的?

select max(a.id) as id,b.cust_no,b.type,b.lotno,sum(count(b.lotno)) 
over(partition by lotno) count,
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 b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc
结果: 8296 12653627 ABH6 4037 84 2014-02-18 8299 12653627 ABH6 4041 1746 2014-02-18 8236 12654172 ABJT 4041 1746 2014-02-18 8287 12654172 ABJT 4042 750 2014-02-18[/quote] 这样呢:

select *
from 
(
select max(a.id) as id,b.cust_no,b.type,b.lotno,
sum(count(b.lotno)) over(partition by lotno) count,
ROW_NUMBER() over(partition by b.lotno order by getdate()) rownum,
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 b.cust_no,b.type,b.lotno,convert(varchar(10),check_time,120) 
)t
where rownum = 1
order by cust_no,lotno asc
唐诗三百首 2014-02-26
  • 打赏
  • 举报
回复
try this,

select id,cust_no,type,lotno,qty,date
from
(select a.id,b.cust_no,b.type,b.lotno,
        count(b.lotno) over(partition by lotno) 'qty',
        convert(varchar(10),check_time,120) 'date',
        row_number() over(partition by b.lotno order by a.id desc) 'rn'
 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') t 
where t.rn=1
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 14 楼 yupeigu 的回复:
这样呢:
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 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 b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc

如果改成这样的话还是不对,但是接近了,结果的第二行数据怎么产生的?

select max(a.id) as id,b.cust_no,b.type,b.lotno,sum(count(b.lotno)) 
over(partition by lotno) count,
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 b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc
结果: 8296 12653627 ABH6 4037 84 2014-02-18 8299 12653627 ABH6 4041 1746 2014-02-18 8236 12654172 ABJT 4041 1746 2014-02-18 8287 12654172 ABJT 4042 750 2014-02-18
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 14 楼 yupeigu 的回复:
这样呢:
select max(a.id) as id,b.cust_no,b.type,b.lotno,count(b.lotno)) over(partition by lotno) count,
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 b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc
结果不对: 8296 12653627 ABH6 4037 1 2014-02-18 8299 12653627 ABH6 4041 2 2014-02-18 8236 12654172 ABJT 4041 2 2014-02-18 8287 12654172 ABJT 4042 1 2014-02-18
  • 打赏
  • 举报
回复
引用 13 楼 lazygc520 的回复:
[quote=引用 12 楼 yupeigu 的回复:] [quote=引用 10 楼 lazygc520 的回复:] [quote=引用 9 楼 yupeigu 的回复:] 你的意思是,语句最后只有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 应该是这样的结果。[/quote] 哦 ,那这个: 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呢[/quote] 我只是举个例子,具体id多少我是不知道的。[/quote] 这样呢:
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 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 b.cust_no,b.type,b.lotno,
convert(varchar(10),check_time,120) order by b.cust_no,b.lotno asc

littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 12 楼 yupeigu 的回复:
[quote=引用 10 楼 lazygc520 的回复:] [quote=引用 9 楼 yupeigu 的回复:] 你的意思是,语句最后只有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 应该是这样的结果。[/quote] 哦 ,那这个: 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呢[/quote] 我只是举个例子,具体id多少我是不知道的。
  • 打赏
  • 举报
回复
引用 10 楼 lazygc520 的回复:
[quote=引用 9 楼 yupeigu 的回复:] 你的意思是,语句最后只有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 应该是这样的结果。[/quote] 哦 ,那这个: 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呢
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
对结果集求分组,结果报错: Column 't.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 但是我不需要对id等select中的字段进行分组,只要对lotno分组。

select id,cust_no,type,lotno,sum(count(t.lotno)) over(partition by t.lotno) cc from
(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')t order by t.cust_no,t.lotno asc
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 9 楼 yupeigu 的回复:
你的意思是,语句最后只有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 应该是这样的结果。
  • 打赏
  • 举报
回复
引用 8 楼 lazygc520 的回复:
[quote=引用 4 楼 yupeigu 的回复:] 没看懂什么意思,能讲讲不
类似结果,但是sql查询不对
select a.id,b.cust_no,b.type,b.lotno,sum(count(b.lotno)) over(partition by 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
部分结果: 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 8296 12653627 ABH6 4041 1746 2014/2/18 8297 12653627 ABH6 4041 1746 2014/2/18 8298 12653627 ABH6 4041 1746 2014/2/18 8299 12653627 ABH6 4041 1746 2014/2/18 8121 12654172 ABJT 4041 1746 2014/2/18 ...... 8280 12654172 ABJT 4042 750 2014/2/18 8281 12654172 ABJT 4042 750 2014/2/18 8282 12654172 ABJT 4042 750 2014/2/18 8283 12654172 ABJT 4042 750 2014/2/18 8284 12654172 ABJT 4042 750 2014/2/18 8285 12654172 ABJT 4042 750 2014/2/18 8286 12654172 ABJT 4042 750 2014/2/18 8287 12654172 ABJT 4042 750 2014/2/18 正确结果应该只有3行。[/quote] 你的意思是,语句最后只有3行?
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 4 楼 yupeigu 的回复:
没看懂什么意思,能讲讲不
类似结果,但是sql查询不对
select a.id,b.cust_no,b.type,b.lotno,sum(count(b.lotno)) over(partition by 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
部分结果: 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 8296 12653627 ABH6 4041 1746 2014/2/18 8297 12653627 ABH6 4041 1746 2014/2/18 8298 12653627 ABH6 4041 1746 2014/2/18 8299 12653627 ABH6 4041 1746 2014/2/18 8121 12654172 ABJT 4041 1746 2014/2/18 ...... 8280 12654172 ABJT 4042 750 2014/2/18 8281 12654172 ABJT 4042 750 2014/2/18 8282 12654172 ABJT 4042 750 2014/2/18 8283 12654172 ABJT 4042 750 2014/2/18 8284 12654172 ABJT 4042 750 2014/2/18 8285 12654172 ABJT 4042 750 2014/2/18 8286 12654172 ABJT 4042 750 2014/2/18 8287 12654172 ABJT 4042 750 2014/2/18 正确结果应该只有3行。
  • 打赏
  • 举报
回复
引用 6 楼 lazygc520 的回复:
[quote=引用 4 楼 yupeigu 的回复:] 没看懂什么意思,能讲讲不
针对lotno分组求count,其他列的值保持不变。[/quote] 试试这个: select a.id,b.cust_no,b.type,b.lotno,convert(varchar(10),check_time,120) as date ,COUNT(*) over(partition by b.lotno) cc 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' order by b.cust_no,b.lotno asc
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 4 楼 yupeigu 的回复:
没看懂什么意思,能讲讲不
针对lotno分组求count,其他列的值保持不变。
littlebirds 2014-02-26
  • 打赏
  • 举报
回复
引用 4 楼 yupeigu 的回复:
没看懂什么意思,能讲讲不
1#写错了,sql语句:

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' order by b.cust_no,b.lotno asc
针对这一sql语句的结果集只对lotno求分组,但是ID,cust_no,type,lotno,date这些信息也都列出来。
加载更多回复(5)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧