【发布时间】:2012-05-01 12:12:07
【问题描述】:
给定 2 行或更多行选择合并,其中之一被标识为模板行。其他行应将其数据合并到模板具有的任何空值列中。
示例数据:
Id Name Address City State Active Email Date
1 Acme1 NULL NULL NULL NULL blah@yada.com 3/1/2011
2 Acme1 1234 Abc Rd Springfield OR 0 blah@gmail.com 1/12/2012
3 Acme2 NULL NULL NULL 1 blah@yahoo.com 4/19/2012
假设用户选择了id为1的行作为模板行,ids为2和3的行将合并到第1行中,然后删除。行 Id 1 中的任何空值列都应填充(如果存在)最新的(请参阅日期列)非空值,并且行 Id 1 中已经存在的非空值将保持原样。对上述数据的查询结果应该是这样的:
Id Name Address City State Active Email Date
1 Acme1 1234 Abc Road Springfield OR 1 blah@yada.com 3/1/2011
请注意,Active 值是 1,而不是 0,因为行 Id 3 具有最近的日期。
附注此外,如果不事先明确定义/知道所有列名是什么,有什么方法可以做到这一点?我正在使用的实际表有很多列,并且一直在添加新列。有没有办法查找表中的所有列名,然后使用该子查询或临时表来完成这项工作?
【问题讨论】:
-
电子邮件是否也应该是 blah@yahoo.com,或者 Acme2 是否被认为超出了合并范围?
-
如何识别数据组?我猜你想合并双数据。那么如何识别表中数千条或更多条记录中的一组数据呢?如果您知道,那么您可以编写一个存储过程来执行此操作。如有必要,我可以编写一个示例 SP 作为答案然后
-
嗨,Russell Fox,不,电子邮件应该保留为 blah@yada.com,因为它已经存在于 Id 1 行中。应该只修改 Id 1 中的空值列。
-
嗨 YvesR,用户通过数据网格选择数据组,用户通过复选框选择行。行 ID 通过参数传递到 SP:一个逗号分隔的 Id varchar,我使用迭代函数解析 Id,然后使用它们从各自的表中提取数据以返回您看到的数据更多。模板行的 Id 也作为参数传递给 SP,以便我知道哪一行是要合并其他行的基本行。
-
附言。当用户在 UI 中选择行,然后单击“合并”按钮时,将显示一个包含所有选定行的弹出窗口,然后用户在其中单击其中一行上的单选按钮以指示他们希望合并的行其他人进入。
标签: sql sql-server tsql sql-server-2008-r2