在SQL中将多行合并为一行

4
在 SQL Server 2008 中,我有一个包含列 [a]、[b]、[c] 和 [sort] 的表格,并且该表格拥有 4 条记录:
1,      NULL,  NULL    0
NULL,   2,     NULL    1
NULL,   NULL,  3       2
10,     NULL,  NULL    3

我需要将所有行组合成一个结果行,对于每一列,我需要获取第一个非空值(按排序列排序)。因此,我的结果应该是:

1,      2,     3

有人能建议如何做到这一点吗? 谢谢


你的表格实际上只有这么少的行吗?如果是这样,最好使用简单的解决方案,例如三个“TOP”查询。 - Martin Smith
它肯定只有少量的记录,很可能少于10条。你能展示一下你所说的三个TOP查询的例子吗? - BlueChameleon
1个回答

7

一种方式

SELECT (SELECT TOP 1 [a]
        FROM   @T
        WHERE  [a] IS NOT NULL
        ORDER  BY [sort]) AS [a],
       (SELECT TOP 1 [b]
        FROM   @T
        WHERE  [b] IS NOT NULL
        ORDER  BY [sort]) AS [b],
       (SELECT TOP 1 [c]
        FROM   @T
        WHERE  [c] IS NOT NULL
        ORDER  BY [sort]) AS [c] 

Or another

;WITH R
     AS (SELECT [a],
                [b],
                [c],
                [sort]
         FROM   @T
         WHERE  [sort] = 0
         UNION ALL
         SELECT Isnull(R.[a], T.[a]),
                Isnull(R.[b], T.[b]),
                Isnull(R.[c], T.[c]),
                T.[sort]
         FROM   @T T
                JOIN R
                  ON T.sort = R.sort + 1
                     AND ( R.[a] IS NULL
                            OR R.[b] IS NULL
                            OR R.[c] IS NULL ))
SELECT TOP 1 [a],
             [b],
             [c]
FROM   R
ORDER  BY [sort] DESC 

+1 - 我一开始用了三个子查询,但后来改变了主意,不过你的解决方案更符合要求。 - James Black

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接