将记录合并为一个

时间:2013-07-05 14:28:11

标签: python sql

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

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

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   |

3 个答案:

答案 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;

我认为第二行的分号是拼写错误,如果存在,你真的不想删除它。