如何使用自联接和分组来编写查询?

时间:2012-02-22 08:23:59

标签: sql sql-server-2008-r2

我有以下格式的sql server 2008 db table 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_MBID字段分隔{{1}} }

我试过各种组合,比如groupby + self join,sub sub queries等等 但我想我错过了一些东西。

是否可以在SQL查询中处理此问题?

提前致谢

2 个答案:

答案 0 :(得分:4)

试试这个:

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

以下是一些更多信息: Concatenate many rows into a single text string?

答案 1 :(得分:1)

您应该可以使用group by执行此操作。可以使用Filesize_IN_MB作为聚合器来聚合sum。但是,要汇总FileName,您可能需要create an AGGREGATE in SQL SERVER 2008R2。这将允许您使用Concatenate作为聚合函数。

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

aggregate concatenation的另一种方式似乎相当简单,但我还没试过。