2013-07-05 91 views
0

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

注:我看到了有关我的问题一些其他话题,但他们并不像我不太一样:

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

我必须说我无法看到你从这[Sql合并多个记录到一个记录]要求的差异(http://stackoverflow.com/questions/16668685/sql-merging-multiple-records-一记录)。答案似乎也不错。 –

+0

这些空白值是否为空或者它们是否为空字符串?是否有可能单个AcctNum在Val1字段中具有多个具有值的记录? – MatBailie

+0

@LennartRegebro - 错,不,这不是重复的... – MatBailie

回答

1
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并返回一个可用值。

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操作:如果要返回多个ACCTNUM

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 

,和你想的行以特定顺序返回,这可能会很棘手。

0

最简单的方法是聚集:

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

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