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

时间:2016-02-08 21:06:17

标签: 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   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), 

谢谢, 马特

更新以显示最终输出: Output Example

0 个答案:

没有答案