Sql 将多行分组
这是我的桌子:Sql 将多行分组,sql,group-by,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个项目
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
(也就是说,我有两个框,分别是第1框和第3框,其中包含0000001、0000002、0000003和0000004项
我有一个盒子,里面装着111111、111111……等等)
而我找不到一个方法去做。。。有什么帮助吗?假设这是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
如果您在SQL Server中工作,则需要在mySQL的组_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
欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以精确地格式化和语法突出显示它!这是MySQL还是其他一些RDBMS(如SQLServer或Oracle)?