0

我正在寻找将前三个记录的值“展平”为第四个记录的最佳方法(如图所示)。这些值将是文本,并且每条记录在其中一个值列中只会有一个值。此外,一个帐号可能有一个甚至多个记录,如示例。谢谢。

注意:我看到了一些与我的问题相关的其他主题,但它们与我的不太一样:

Sql将多条记录合并为一条记录

将多条记录合并到表中的一行

AcctNum|Val1|Val2|Val3|
1      |x   |    |    |
1      |    |y   |    |
1      |    |    |z   |
1      |x   |y   |z   |
4

3 回答 3

1
SELECT
  AcctNum,
  MAX(Val1)   AS Val1,
  MAX(Val2)   AS Val2,
  MAX(Val3)   AS Val3
FROM
  yourTable
GROUP BY
  AcctNum

NULL绝不是任何一组值的最大值或最小值。 MAX()并且只有在没有行或所有值都是.MIN()时才会返回。NULLNULL

这意味着MAX()MIN()将消除所有的NULL并仅返回一个可用值。

于 2013-07-05T14:38:06.027 回答
0

执行此操作的 SQL 方法是使用聚合函数和 GROUP BY,例如

SELECT t.AcctNum
     , MAX(t.Val1) AS Val1
     , MAX(t.Val2) AS Val2
     , MAX(t.Val3) AS Val3
  FROM mytab t
 WHERE t.AcctNum = 1
 GROUP BY t.AcctNum

如果要返回三行加上第四行,可以使用 UNION ALL 运算符:

SELECT t.AcctNum
     , t.Val1
     , t.Val2
     , t.Val3
  FROM mytab t
 WHERE t.AcctNum = 1
 UNION ALL
SELECT t.AcctNum
     , MAX(t.Val1) AS Val1
     , MAX(t.Val2) AS Val2
     , MAX(t.Val3) AS Val3
  FROM mytab t
 WHERE t.AcctNum = 1
 GROUP BY t.AcctNum

如果要返回多个 AcctNum,并且希望以特定顺序返回行,这可能会很棘手。

于 2013-07-05T14:38:08.050 回答
0

最简单的方法是聚合:

select AcctNum, max(val1) as val1, max(val2) as val2, max(val3) as val3
from Yourtable t
group by AcctNum;

我认为第二行的分号是错字,如果存在,您并不打算将其删除。

于 2013-07-05T14:38:56.490 回答