我正在寻找将前三个记录的值“压平”到第四个记录的最佳方法(如图所示)。值将是文本,并且每个记录在其中一个值列中只有一个值。此外,一个帐号可能有一个甚至多个记录,如示例。感谢。
注意:我已经看到了一些与我的问题相关的其他主题,但它们与我的不一样:
Sql Merging multiple records into one record
Merge multiple records into one row in a table
AcctNum|Val1|Val2|Val3|
1 |x | | |
1 | |y | |
1 | | |z |
1 |x |y |z |
答案 0 :(得分:1)
SELECT
AcctNum,
MAX(Val1) AS Val1,
MAX(Val2) AS Val2,
MAX(Val3) AS Val3
FROM
yourTable
GROUP BY
AcctNum
NULL
绝不是任何一组值的MAX或MIN。 MAX()
和MIN()
只有在没有行的情况下才会返回NULL
,或 所有 的值为NULL
这意味着MAX()
或MIN()
将消除所有NULL
并仅返回一个可用值。
答案 1 :(得分: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,并且希望按特定顺序返回行,那可能会很棘手。
答案 2 :(得分:0)
最简单的方法是聚合:
select AcctNum, max(val1) as val1, max(val2) as val2, max(val3) as val3
from Yourtable t
group by AcctNum;
我认为第二行的分号是拼写错误,如果存在,你真的不想删除它。