这是我的表:
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
这意味着:
注意!
现在问题;
我想将具有完全相同内容的所有方框分组,计算相同方框的数量,如此,但任何其他方法都有效,这只是说明我的需求的一个例子:
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 ......等等的盒子)
我找不到办法去做...有什么帮助吗?
答案 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