【问题标题】:How to write query using self join and group by?如何使用自联接和分组编写查询?
【发布时间】:2012-02-22 17:12:57
【问题描述】:

我有以下格式的 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 查询中处理这个问题?

提前致谢

【问题讨论】:

标签: sql sql-server-2008-r2


【解决方案1】:

试试这个:

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?

【讨论】:

    【解决方案2】:

    您应该可以使用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 还有另一种方式,看起来相当简单,但我没有尝试过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 2014-09-24
      • 2013-05-02
      相关资源
      最近更新 更多