Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将多行分组_Sql_Group By - Fatal编程技术网

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)?