我正在寻找将前三个记录的值“展平”为第四个记录的最佳方法(如图所示)。这些值将是文本,并且每条记录在其中一个值列中只会有一个值。此外,一个帐号可能有一个甚至多个记录,如示例。谢谢。
注意:我看到了一些与我的问题相关的其他主题,但它们与我的不太一样:
AcctNum|Val1|Val2|Val3|
1 |x | | |
1 | |y | |
1 | | |z |
1 |x |y |z |
我正在寻找将前三个记录的值“展平”为第四个记录的最佳方法(如图所示)。这些值将是文本,并且每条记录在其中一个值列中只会有一个值。此外,一个帐号可能有一个甚至多个记录,如示例。谢谢。
注意:我看到了一些与我的问题相关的其他主题,但它们与我的不太一样:
AcctNum|Val1|Val2|Val3|
1 |x | | |
1 | |y | |
1 | | |z |
1 |x |y |z |
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并仅返回一个可用值。
执行此操作的 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,并且希望以特定顺序返回行,这可能会很棘手。
最简单的方法是聚合:
select AcctNum, max(val1) as val1, max(val2) as val2, max(val3) as val3
from Yourtable t
group by AcctNum;
我认为第二行的分号是错字,如果存在,您并不打算将其删除。