2012-02-27 2 views
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 

Что означает:

  • Box 1 имеет 4 различных предметов.
  • Вставка 2 содержит 4 изделия.
  • Вставка 3 имеет 4 позиции.
  • Вставка 4 содержит 3 изделия.

Внимание!

  • Вставка 1 и коробка 3 содержат точно такие же элементы, поэтому мы можем их сгруппировать.
  • Box 4 содержит почти такой же, как коробки 1 и коробки 3, но на самом деле не то же самое, таким образом, мы не можем с группой коробки 1 и коробки 3.

Теперь вопрос;

Я хочу, чтобы сгруппировать все коробки с точно таким же содержанием, имея подсчет количества одинаковых коробок, как это, но любой другой подход справедлив, это всего лишь пример, чтобы ilustrate моих потребностей:

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, 111111 ... и т.д. и т.п.)

И я не могу найти способ сделать это ... Любая помощь?

+3

Добро пожаловать в StackOverflow: если вы разместите код, XML или данных образцов, пожалуйста ** ** выделить те строки в текстовом редакторе и нажмите на «образцы кода» кнопку ('{}') на панели инструментов редактора, чтобы красиво форматировать и синтаксис выделить его! –

+1

Является ли это MySQL или какой-либо другой СУБД (например, SQLServer или Oracle)? –

ответ

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 
0

Если вы работаете в SQL Server, вам нужно использовать что-то вроде этого для GROUP_CONCAT из MySql http://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=createacommadelimitedlist. Решение mySQL и одно из них предполагают, что порядок элементов в каждом поле всегда одинаковый или элементы должны быть отсортированы до того, как они будут объединены, чтобы вы могли сравнивать содержимое каждого окна. THis заканчивает тем, что довольно грязным со всей вложенностью, но она производит желаемый результат:

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 
Смежные вопросы