2015-07-16 2 views
1

У меня есть сомнения в запросе SQL ServerГруппа Элемент по Сумма столбца

У меня есть таблица dbo.[Files] с колоннами Id, FileName, FileSize(MB)

Id FileName FileSize(MB) 
---------------------------- 
1 aa.gif  3 
2 bb.gif  5 
3 cc.gif  7 
4 dd.gif  5 
5 ee.gif  2 
6 fff.gif  4 
7 gg.gif  3 

Мое требование, я имею в группу с максимальный размер файла и указать группу. Номер для группы, размер которой меньше или равен максимальному пределу.

Предположим, что максимальный размер файла составляет 10

Пример результата:

Id FileName FileSize(MB) GroupNo 
-------------------------------------- 
1 aa.gif   3    1 
2 bb.gif   5    1 
5 ee.gif   2    1 
3 cc.gif   7    2 
7 gg.gif   3    2 
4 dd.gif   5    3 
6 fff.gif  4    3 

Сумма FileSize в группе составляет 10

Окончательный результат требуется

GroupNo Ids 
-------------- 
1  1,2,5 
2  4,6 
3  3,7 
+1

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

+0

Вопрос, какой результат вам нужен, первый или второй? Также вы пробовали какие-либо вопросы? – cjds

+0

Вы можете найти этот вопрос со вчерашнего дня: http://stackoverflow.com/questions/31435162/oracle-aggregation-function-to-allocate-amount –

ответ

0

Можете ли вы проверить, если ниже запрос извлечения нужного вывода:

 Select 
     GroupNo, 
     LISTAGG((id)|| ',' ORDER BY id) 
     from your_table; 
+0

Ум, я почти уверен, что вопрос о том, как поместить идентификаторы в группы, а не только о том, как получить третий стол со второго – cjds

+0

Ну, в своем последнем комментарии он сказал, что его требование - это последний набор результатов. Сначала я также подумал, что требование состоит в том, как положить идентификаторы в группы. Давайте посмотрим, что пользователь должен сказать. @CarlSaldanha –

+0

Я не уверен, какую базу данных вы используете. вы также можете обратиться к этой ссылке. https: //www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/ @RAGESHMK –

1

Я пробовал совсем немного, но в конце концов мне пришлось согласиться на процедурное решение, хотя и в T-SQL. Следующий скрипт работает во временной таблице @t1 (столбцы: id, fn, size, gr), в которую данные должны быть скопированы первыми. В качестве альтернативы вы также можете оборудовать свою исходную таблицу дополнительным столбцом идентификатора группы gr и затем работать над этой таблицей.

declare @g int=1, @cnt int,@si int; 
    -- group-no, row-count, size of group 
select @cnt=count(*) from #t1 where gr=0; 
while (@cnt>0) begin 
select @si=isnull(sum(size),0) from #t1 where [email protected]; 
update #t1 set [email protected] where id = (
select top 1 id from #t1 
where gr=0 and @si+size<=10 
order by @si+size desc); 
if (@@rowcount=0) begin 
    if (@si=0) update top(1) #t1 set [email protected] 
      where gr=0; -- for files > 10mb 
    set @[email protected]+1; 
    end; 
    select @cnt=count(*) from #t1 where gr=0 
end; 

select * from #t1 

Рабочий пример можно найти в http://data.stackexchange.com/stackoverflow/query/337062/group-into-10mb-chunks-2

Смежные вопросы