分组多行

时间:2012-02-27 11:16:20

标签: sql group-by

这是我的表:

BOX  ITEM
1    0000001
1    0000002
1    0000003
1    0000004
2    1111111
2    1111111
2    1111111
2    1111111
3    0000001
3    0000002
3    0000003
3    0000004
4    0000001
4    0000002
4    0000003

这意味着:

  • 方框1有4个不同的项目。
  • 方框2有4个项目。
  • 方框3有4个项目。
  • 方框4有3个项目。

注意!

  • 框1和框3包含完全相同的项目,因此我们可以对它们进行分组。
  • 方框4包含与方框1和方框3几乎相同但不完全相同,因此,我们无法将方框1和方框3分组。

现在问题;

我想将具有完全相同内容的所有方框分组,计算相同方框的数量,如此,但任何其他方法都有效,这只是说明我的需求的一个例子:

QUANTITY   ITEM       BOX
   2       0000001    1, 3
   2       0000002    1, 3
   2       0000003    1, 3
   2       0000004    1, 3
   1       1111111    2
   1       1111111    2
   1       1111111    2
   1       1111111    2
   1       0000001    4
   1       0000002    4
   1       0000003    4

(这意味着,我有2个方框,其中包含项目0000001,0000002,0000003和0000004,它们是方框1和方框3。

我有1个包装箱111111,11111 ......等等的盒子)

我找不到办法去做...有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

假设这是MySQL,请尝试:

select count(distinct box) quantity, items, group_concat(box) boxes 
from
(select box, group_concat(item) items
 from my_table
 group by box) v
group by items

答案 1 :(得分:0)

如果您在SQL Server中工作,则需要对mySQL http://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=createacommadelimitedlist的group_concat使用类似的内容。 mySQL解决方案和这个解决方案都假设每个框中的项目顺序始终相同,或者在连接之前需要对项目进行排序,以便您可以比较每个框的内容。这最终看起来非常混乱所有的嵌套,但它产生了所需的输出:

SELECT  count(box) NumBoxes, 
        list Contents, 
        BoxList = substring((SELECT ( ', ' + cast(box as varchar) )
                             FROM (SELECT   b1.box,
                                            List = substring((SELECT ( ', ' + item )
                                                              FROM boxes b2
                                                              WHERE b1.box = b2.box
                                                              ORDER BY box, item
                                                               FOR XML PATH( '' )
                                                            ), 3, 1000 )
                                    FROM boxes b1
                                    GROUP BY box
                                   ) source2
                             WHERE source1.list  = source2.list
                             ORDER BY box, list
                             FOR XML Path( '' )
                           ), 3, 1000 )
FROM(SELECT b1.box,
            List = substring((SELECT ( ', ' + item )
                              FROM boxes b2
                              WHERE b1.box = b2.box
                              ORDER BY box, item
                              FOR XML PATH( '' )
                            ), 3, 1000 )
      FROM boxes b1
      GROUP BY box
    ) source1
GROUP BY list

顺便说一句,为了测试我使用了这个表,并且BOX是INT数据类型的事实需要在第三行代码中进行强制转换:

create table boxes(
BOX int null,  
ITEM char(7) null)
go
insert into boxes
values(1,'0000001'),
(1,'0000002'),
(1,'0000003'),
(1,'0000004'),
(2,'1111111'),
(2,'1111111'),
(2,'1111111'),
(2,'1111111'),
(3,'0000001'),
(3,'0000002'),
(3,'0000003'),
(3,'0000004'),
(4,'0000001'),
(4,'0000002'),
(4,'0000003')
go