5

Given 2 or more rows that are selected to merge, one of them is identified as being the template row. The other rows should merge their data into any null value columns that the template has.

Example data:

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

Say that a user has chosen row with Id 1 as the template row, and rows with Ids 2 and 3 are to be merged into row 1 and then deleted. Any null value columns in row Id 1 should be filled with (if one exists) the most recent (see Date column) non-null value, and non-null values already present in row Id 1 are to be left as is. The result of this query on the above data should be exactly this:

Id  Name     Address          City          State   Active  Email             Date
1   Acme1    1234 Abc Road    Springfield   OR      1       blah@yada.com     3/1/2011

Notice that the Active value is 1, and not 0 because row Id 3 had the most recent date.

P.S. Also, is there any way possible to do this without explicitly defining/knowing beforehand what all the column names are? The actual table I'm working with has a ton of columns, with new ones being added all the time. Is there a way to look up all the column names in the table, and then use that subquery or temptable to do the job?

4

4 に答える 4

1

動的列の場合、動的 SQL を使用してソリューションを作成する必要があります。

sys.columns と sys.tables にクエリを実行して、必要な列のリストを取得できます。次に、null 列ごとに 1 回逆方向にループして、その列の最初の非 null 行を見つけ、その列の出力行を更新します。ループで 0 になると、ユーザーに表示できる完全な行が得られます。

于 2012-04-19T23:25:29.687 に答える