Как написать запрос с помощью самостоятельного объединения и группировки по? - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть таблица базы данных sql server 2008 db FILE_DETAILS в следующем формате.

ID    FileName    Filesize_in_MB
--------------------------------
1     a.txt        5
2     b.txt        2
3     c.txt        2
3     d.txt        4
4     e.txt        6
4     f.txt        1
4     g.txt        2
5     h.txt        8
6     i.txt        7

Теперь я хочу получить следующее:

ID    FileName    Filesize_in_MB
--------------------------------
1     a.txt               5
2     b.txt               2
3     c.txt;d.txt         6
4     e.txt;f.txt;g.txt   9
5     h.txt               8
6     i.txt               7

В приведенных выше результатах происходит IDстал уникальным ключом, а FILENAME был присоединен и разделен ;, а также полем FILESIZE_IN_MB в сумме групп по ID

Я пробовал с различными комбинациями, такими как groupby + self join, также подзапросыи все это, но я думаю, что я что-то упустил.

можно ли обработать это в запросе SQL?

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 22 февраля 2012

Попробуйте это:

SELECT  ID, 
        STUFF(( SELECT ';' + [FileName] 
                FROM FILE_DETAILS 
                WHERE ID = f.ID FOR XML PATH('')), 1, 1, ''), 
        SUM(Filesize_in_MB)
FROM    FILE_DETAILS f
GROUP BY ID

Вот еще немного информации: Объединить много строк в одну текстовую строку?

1 голос
/ 22 февраля 2012

Вы должны быть в состоянии сделать это, используя group by.Агрегирование Filesize_IN_MB может быть выполнено с использованием sum в качестве агрегатора.Однако для агрегирования FileName может потребоваться создать AGGREGATE в SQL SERVER 2008R2 .Это позволит вам использовать Concatenate в качестве функции агрегирования.

select Concatenate(FileName), sum(Filesize_IN_MB) FROM FILE_DETAILS group by ID

Существует еще один способ агрегирования конкатенации , который кажется довольно простым, но я не пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...