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.   

    select 箱号=(ltrim(min(箱号))+'-'+ltrim(max(箱号))),
     箱数=count(1),
     色号,
     尺码,
     数量
    from 
    [Table]
    group by 色号,尺码,数量
      

  2.   

    declare @a table(箱号 int, 色号 varchar(10), 尺码 char(1), 数量 int)
    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 箱号
      

  3.   

    箱号                        箱数          色号         尺码   数量          
    ------------------------- ----------- ---------- ---- ----------- 
    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 行)
      

  4.   

    序号   箱号                        箱数          色号         尺码   数量          
           ------------------------- ----------- ---------- ---- ----------- 
    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
      

  5.   

    如数据是下面的时候
    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
      

  6.   

    create table tb(箱号 int,色号 varchar(10),尺码 varchar(10),数量 int)
    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 行)
    */