A表内容如下
箱号 色号 尺码 数量
1 BLACK M 20
2 BLACK M 20
3 BLACK L 20
4 BLACK L 15
4 WHITE M 5
6 BLACK M 5
6 BLACK L 5
6 WHITE M 5
6 WIHTE L 5
7 BLACK M 5
7 BLACK L 5
7 WHITE M 5
7 WIHTE L 5
8 BLACK M 5
8 BLACK L 5
8 WHITE M 5
8 WIHTE L 5
想得到如下的一张B表能不能用SQL语句实现?箱号 箱数 色号 尺码 数量
1-2 2 BLACK M 20
3 1 BLACK L 20
4 1 BLACK L 15
4 WHITE M 5
6-8 3 BLACK M 5
6-8 BLACK L 5
6-8 WHITE M 5
6-8 WHITE L 5
上面的这个结果不想用编程方式来搞定,能不能用SQL语句直接搞定?
箱号 色号 尺码 数量
1 BLACK M 20
2 BLACK M 20
3 BLACK L 20
4 BLACK L 15
4 WHITE M 5
6 BLACK M 5
6 BLACK L 5
6 WHITE M 5
6 WIHTE L 5
7 BLACK M 5
7 BLACK L 5
7 WHITE M 5
7 WIHTE L 5
8 BLACK M 5
8 BLACK L 5
8 WHITE M 5
8 WIHTE L 5
想得到如下的一张B表能不能用SQL语句实现?箱号 箱数 色号 尺码 数量
1-2 2 BLACK M 20
3 1 BLACK L 20
4 1 BLACK L 15
4 WHITE M 5
6-8 3 BLACK M 5
6-8 BLACK L 5
6-8 WHITE M 5
6-8 WHITE L 5
上面的这个结果不想用编程方式来搞定,能不能用SQL语句直接搞定?
箱数=count(1),
色号,
尺码,
数量
from
[Table]
group by 色号,尺码,数量
insert @a select 1 ,'BLACK', 'M', 20
union all select 2 ,'BLACK', 'M', 20
union all select 3 ,'BLACK', 'L', 20
union all select 4 ,'BLACK', 'L', 15
union all select 4 ,'WHITE', 'M', 5
union all select 6 ,'BLACK', 'M', 5
union all select 6 ,'BLACK', 'L', 5
union all select 6 ,'WHITE', 'M', 5
union all select 6 ,'WIHTE', 'L', 5
union all select 7 ,'BLACK', 'M', 5
union all select 7 ,'BLACK', 'L',5
union all select 7 ,'WHITE', 'M', 5
union all select 7 ,'WIHTE', 'L', 5
union all select 8 ,'BLACK', 'M', 5
union all select 8 ,'BLACK', 'L', 5
union all select 8 ,'WHITE', 'M', 5
union all select 8 ,'WIHTE', 'L', 5
select 箱号=case when min(箱号)<>max(箱号) then (ltrim(min(箱号))+'-'+ltrim(max(箱号))) else ltrim(min(箱号)) end,
箱数=count(1),
色号,
尺码,
数量
from
@a
group by 色号,尺码,数量
order by 箱号
------------------------- ----------- ---------- ---- -----------
1-2 2 BLACK M 20
3 1 BLACK L 20
4 1 BLACK L 15
4-8 4 WHITE M 5
6-8 3 WIHTE L 5
6-8 3 BLACK L 5
6-8 3 BLACK M 5(所影响的行数为 7 行)
------------------------- ----------- ---------- ---- -----------
1 1-2 2 BLACK M 20
2 3 1 BLACK L 20
3 4 1 BLACK L 15
4 4-8 4 WHITE M 5
5 6-8 3 WIHTE L 5
6 6-8 3 BLACK L 5
7 6-8 3 BLACK M 5因为前面不加一个序号则不会按箱号排序因为箱号中存在"1-10"这样的SQL按字符处理所以排序出来的不正确比如说是1~10则会出现
箱号
1
10
2
3
4
5
6
7
8
9
1 BLACK M 35
2 WHITE M 35
3 SKY M 35
4 BLACK M 35
5 WHITE M 3
5 BLACK M 3
5 SKY M 5
5 KHAKI M 4
6 BLACK L 35
7 WHITE L 34
8 SKY L 35
9 BLACK L 35
10 WHITE L 5
10 BLACK L 5
10 SKY L 5
10 KHAKI L 6得到的检索就是这样结果
1 BLACK M 35
10 WHITE L 5
10 BLACK L 5
10 SKY L 5
10 KHAKI L 6
2 WHITE M 35
3 SKY M 35
4 BLACK M 35
5 WHITE M 3
5 BLACK M 3
5 SKY M 5
5 KHAKI M 4
6 BLACK L 35
7 WHITE L 34
8 SKY L 35
9 BLACK L 35
insert into tb values(1, 'BLACK', 'M', 20)
insert into tb values(2, 'BLACK', 'M', 20)
insert into tb values(3, 'BLACK', 'L', 20)
insert into tb values(4, 'BLACK', 'L', 15)
insert into tb values(4, 'WHITE', 'M', 5)
insert into tb values(6, 'BLACK', 'M', 5)
insert into tb values(6, 'BLACK', 'L', 5)
insert into tb values(6, 'WHITE', 'M', 5)
insert into tb values(6, 'WIHTE', 'L', 5)
insert into tb values(7, 'BLACK', 'M', 5)
insert into tb values(7, 'BLACK', 'L', 5)
insert into tb values(7, 'WHITE', 'M', 5)
insert into tb values(7, 'WIHTE', 'L', 5)
insert into tb values(8, 'BLACK', 'M', 5)
insert into tb values(8, 'BLACK', 'L', 5)
insert into tb values(8, 'WHITE', 'M', 5)
insert into tb values(8, 'WIHTE', 'L', 5)
goselect cast(t1.箱号 as varchar) + '-' + cast(t2.箱号 as varchar) 箱号,t1.箱数 , t1.色号 , t1.尺码 , t1.数量 from
(select 色号 , 尺码 , 数量 , min(箱号) 箱号 , count(*) 箱数 from tb group by 色号 , 尺码 , 数量) t1
left join
(select 色号 , 尺码 , 数量 , max(箱号) 箱号 , count(*) 箱数 from tb group by 色号 , 尺码 , 数量) t2
on t1.色号 = t1.色号 and t1.尺码 = t2.尺码 and t1.数量 = t2.数量
order by 箱号
drop table tb/*
箱号 箱数 色号 尺码 数量
---- ----------- ---------- ---------- -----------
1-2 2 BLACK M 20
3-3 1 BLACK L 20
4-4 1 BLACK L 15
4-8 4 WHITE M 5
4-8 4 WHITE M 5
6-8 3 BLACK M 5
6-8 3 BLACK M 5
6-8 3 BLACK L 5
6-8 3 BLACK L 5
6-8 3 WIHTE L 5
6-8 3 WIHTE L 5
(所影响的行数为 11 行)
*/