我正在寻找将前三个记录的值“展平”为第四个记录的最佳方法(如图所示)。这些值将是文本,并且每条记录在其中一个值列中只会有一个值。此外,一个帐号可能有一个甚至多个记录,如示例。谢谢。
注意:我看到了一些与我的问题相关的其他主题,但它们与我的不太一样:
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()
时才会返回。NULL
NULL
这意味着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;
我认为第二行的分号是错字,如果存在,您并不打算将其删除。