MSSQL语句怎样实现下图?

时间:2021-06-09 17:16:07

箱号 色号 颜色 尺码 24       25       26      27    28    29    30  
1-3 019 淺花灰    26

4-15 019 淺花灰  26                

16-31 019 淺花灰 24
32-41 019 淺花灰

42 030 花灰橙 21 4

43-46 030 花灰橙 26 26
47-52 030 花灰橙 24
53-56 030 花灰橙

57 730 紫羅蘭 26 1 2
58-62 730 紫羅蘭 26
63-69 730 紫羅蘭 24
70-73 730 紫羅蘭 22

74-78 900 黑色 26

136 019 淺花灰 12 1 6
137 030 花灰橙 15 1 5
138 730 紫羅蘭 9    1        9
 1:上图中箱号 1-3(中间有“-”代表是第1箱;第2箱;第3箱)表示有3箱,而且这3箱都是标准箱;
    里面只装单色单码的商品。
 2:上图中箱号 138,表示只有1箱;箱号是第138箱;而且是尾箱,里面装有3中不同尺码或者不同颜色的商品。

怎么实现上图中: 如果有10箱;前9箱是单色单码的,就用1-9表示,第10箱是多色多码,就用10表示。

谢谢大家!

10 个解决方案

#1


你的意思是,要改箱号?

#2


.............神马玩意,看不懂

#3


还有,你最好把表的内容发到"源代码"里,点上面那个#,打开的一个UBB格式的里面,这样,数据的位置不会变.

#4


箱号     数量     颜色      尺码
01 10 0493 27
02 10 0493 27
03 10 0493 27
04 10 0497 27
05 10 0493 27
06 10 0493 28
07 10 0493 29
08 10 0493 29
09 3 0493 31
09 7 0495 32
10 8 0495 31
10 2 0496 27

现在做的就是每一箱都会有一行数据,
希望做成
1-5 10 0493 27
06 10 0493 28
7-8 10 0493 29
09 3 0493 31
09 7 0495 32
10 8 0495 31
10 2 0496 27

求解。

#5


没看懂

#6



--我建议你数据库里还是这样好点,你要的格式坑人的
箱号 数量 颜色 尺码
01 10 0493 27
02 10 0493 27
03 10 0493 27
04 10 0497 27
05 10 0493 27
06 10 0493 28
07 10 0493 29
08 10 0493 29
09 3 0493 31
09 7 0495 32
10 8 0495 31
10 2 0496 27

#7


不好意思,编辑的时候,样式是可以的,发帖后,样式就错乱了的。

#9


谢谢各位大虾了。

#10



--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb] (箱号 varchar(2),数量 int,颜色 varchar(4),尺码 int)
insert into [tb]
select '01',10,'0493',27 union all
select '02',10,'0493',27 union all
select '03',10,'0493',27 union all
select '04',10,'0493',27 union all
select '05',10,'0493',27 union all
select '06',10,'0493',28 union all
select '07',10,'0493',29 union all
select '08',10,'0493',29 union all
select '09',3,'0493',31 union all
select '09',7,'0495',32 union all
select '10',8,'0495',31 union all
select '10',2,'0496',27

--select * from [tb]
;with cte as( 
select groupid=箱号-(select count(*) from tb where a.箱号>=箱号),
箱号,尺码,颜色,数量
from tb a

select 箱号=case when min(箱号)<>max(箱号) then ltrim(convert(int,min(箱号)))+'-'+ltrim(convert(int,max(箱号)))
else convert(varchar,min(箱号)) end,
数量,颜色,尺码
from cte
group by groupid,数量,颜色,尺码
order by 颜色,case 颜色 when '0493' then 尺码 else 1 end

drop table [tb]

/*
1-5 10 0493 27
06 10 0493 28
7-8 10 0493 29
09 3 0493 31
09 7 0495 32
10 8 0495 31
10 2 0496 27

#1


你的意思是,要改箱号?

#2


.............神马玩意,看不懂

#3


还有,你最好把表的内容发到"源代码"里,点上面那个#,打开的一个UBB格式的里面,这样,数据的位置不会变.

#4


箱号     数量     颜色      尺码
01 10 0493 27
02 10 0493 27
03 10 0493 27
04 10 0497 27
05 10 0493 27
06 10 0493 28
07 10 0493 29
08 10 0493 29
09 3 0493 31
09 7 0495 32
10 8 0495 31
10 2 0496 27

现在做的就是每一箱都会有一行数据,
希望做成
1-5 10 0493 27
06 10 0493 28
7-8 10 0493 29
09 3 0493 31
09 7 0495 32
10 8 0495 31
10 2 0496 27

求解。

#5


没看懂

#6



--我建议你数据库里还是这样好点,你要的格式坑人的
箱号 数量 颜色 尺码
01 10 0493 27
02 10 0493 27
03 10 0493 27
04 10 0497 27
05 10 0493 27
06 10 0493 28
07 10 0493 29
08 10 0493 29
09 3 0493 31
09 7 0495 32
10 8 0495 31
10 2 0496 27

#7


不好意思,编辑的时候,样式是可以的,发帖后,样式就错乱了的。

#8


#9


谢谢各位大虾了。

#10



--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb] (箱号 varchar(2),数量 int,颜色 varchar(4),尺码 int)
insert into [tb]
select '01',10,'0493',27 union all
select '02',10,'0493',27 union all
select '03',10,'0493',27 union all
select '04',10,'0493',27 union all
select '05',10,'0493',27 union all
select '06',10,'0493',28 union all
select '07',10,'0493',29 union all
select '08',10,'0493',29 union all
select '09',3,'0493',31 union all
select '09',7,'0495',32 union all
select '10',8,'0495',31 union all
select '10',2,'0496',27

--select * from [tb]
;with cte as( 
select groupid=箱号-(select count(*) from tb where a.箱号>=箱号),
箱号,尺码,颜色,数量
from tb a

select 箱号=case when min(箱号)<>max(箱号) then ltrim(convert(int,min(箱号)))+'-'+ltrim(convert(int,max(箱号)))
else convert(varchar,min(箱号)) end,
数量,颜色,尺码
from cte
group by groupid,数量,颜色,尺码
order by 颜色,case 颜色 when '0493' then 尺码 else 1 end

drop table [tb]

/*
1-5 10 0493 27
06 10 0493 28
7-8 10 0493 29
09 3 0493 31
09 7 0495 32
10 8 0495 31
10 2 0496 27