用于报告的SQL多行到多列(所需列数未知)

用于报告的SQL多行到多列(所需列数未知),sql,denormalization,Sql,Denormalization,我已经搜索了许多非规范化和多行到多列的帖子,但似乎没有一个能满足我的要求 我有一个具有重复ID的表,在其他字段中具有不同的值。根据关联记录的数量,ID可以有1-20行 例如: Input - ID Name Address 1 A A1 1 B A2 1 C A3 1 C A4 Output - ID Name1 Address1 Name2 Address2 Name3 Ad

我已经搜索了许多非规范化和多行到多列的帖子,但似乎没有一个能满足我的要求

我有一个具有重复ID的表,在其他字段中具有不同的值。根据关联记录的数量,ID可以有1-20行

例如:

Input - 
ID  Name    Address
1   A         A1
1   B         A2
1   C         A3
1   C         A4

Output - 
ID  Name1   Address1    Name2   Address2    Name3   Address3    Name4   Address4
1   A         A1          B       A2          C       A3          C        A4
我写了一些非常难看的SQL,在插入之前检查每个字段,但我希望有一种更干净的方法,因为这对更改非常不灵活。任何想法

 COL_1 = (CASE WHEN COL_1 IS NULL THEN @CLINE ELSE COL_1 END),
COL_2 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NULL THEN @CLINE ELSE COL_2 END),
COL_3 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NULL THEN @CLINE ELSE COL_3 END),
COL_4 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NULL THEN @CLINE ELSE COL_4 END),
COL_5 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NULL THEN @CLINE ELSE COL_5 END),
COL_6 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NULL THEN @CLINE ELSE COL_6 END),
COL_7 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NULL THEN @CLINE ELSE COL_7 END),
COL_8 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NULL THEN @CLINE ELSE COL_8 END),
COL_9 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NULL THEN @CLINE ELSE COL_9 END),
COL_10 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NULL THEN @CLINE ELSE COL_10 END),
COL_11 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NOT NULL and COL_11 IS NULL THEN @CLINE ELSE COL_11 END),
COL_12 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NOT NULL and COL_11 IS NOT NULL and COL_12 IS NULL THEN @CLINE ELSE COL_12 END),
COL_13 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NOT NULL and COL_11 IS NOT NULL and COL_12 IS NOT NULL and COL_13 IS NULL THEN @CLINE ELSE COL_13 END),
COL_14 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NOT NULL and COL_11 IS NOT NULL and COL_12 IS NOT NULL and COL_13 IS NOT NULL and COL_14 IS NULL THEN @CLINE ELSE COL_14 END),
COL_15 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NOT NULL and COL_11 IS NOT NULL and COL_12 IS NOT NULL and COL_13 IS NOT NULL and COL_14 IS NOT NULL and COL_15 IS NULL THEN @CLINE ELSE COL_15 END),
COL_16 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NOT NULL and COL_11 IS NOT NULL and COL_12 IS NOT NULL and COL_13 IS NOT NULL and COL_14 IS NOT NULL and COL_15 IS NOT NULL and COL_16 IS NULL THEN @CLINE ELSE COL_16 END),
COL_17 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NOT NULL and COL_11 IS NOT NULL and COL_12 IS NOT NULL and COL_13 IS NOT NULL and COL_14 IS NOT NULL and COL_15 IS NOT NULL and COL_16 IS NOT NULL and COL_17 IS NULL THEN @CLINE ELSE COL_17 END),
COL_18 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NOT NULL and COL_11 IS NOT NULL and COL_12 IS NOT NULL and COL_13 IS NOT NULL and COL_14 IS NOT NULL and COL_15 IS NOT NULL and COL_16 IS NOT NULL and COL_17 IS NOT NULL and COL_18 IS NULL THEN @CLINE ELSE COL_18 END),
COL_19 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NOT NULL and COL_11 IS NOT NULL and COL_12 IS NOT NULL and COL_13 IS NOT NULL and COL_14 IS NOT NULL and COL_15 IS NOT NULL and COL_16 IS NOT NULL and COL_17 IS NOT NULL and COL_18 IS NOT NULL and COL_19 IS NULL THEN @CLINE ELSE COL_19 END),
COL_20 = (CASE WHEN COL_1 IS NOT NULL and COL_2 IS NOT NULL and COL_3 IS NOT NULL and COL_4 IS NOT NULL and COL_5 IS NOT NULL and COL_6 IS NOT NULL and COL_7 IS NOT NULL and COL_8 IS NOT NULL and COL_9 IS NOT NULL and COL_10 IS NOT NULL and COL_11 IS NOT NULL and COL_12 IS NOT NULL and COL_13 IS NOT NULL and COL_14 IS NOT NULL and COL_15 IS NOT NULL and COL_16 IS NOT NULL and COL_17 IS NOT NULL and COL_18 IS NOT NULL and COL_19 IS NOT NULL and COL_20 IS NULL THEN @CLINE ELSE COL_20 END), 
谢谢, 马特

已更新以显示最终输出:

一旦您获得结果,您将如何使用这些结果?您是否考虑过返回具有相同ID的所有数据的组?(即,按功能分组)光标可能是正确的选择?我可能完全没有把握,但听起来像是那种问题。乔-我实际上是在用光标填充变量,然后我需要取这些变量,看看第一组列是否已填充。如果是,请转到第二组columns.Taraz-我正在创建一个表,其中一行基于ID,然后在报告中使用此数据。因此,每组列将在报告中的一行上生成。这有点像我必须对表进行非规范化以使其规范化报表。我在上面添加了输出示例!