检查一系列列是否在一行中保持相同的值?

时间:2016-07-01 10:26:03

标签: sql sql-server

我有一个包含13列的遗留表,其值为1-5。必须将它们迁移到新数据库。然而,一些列保持值9,这是"的虚拟值,不能对此进行评级"我们决定所有"不能评价这个"值应该变为3而不是9。

然而,有些行在所有13列中只包含9个,我们希望完全跳过这些行,因为它们在宏观方案中毫无意义。

我可以硬编码一个长的" WHERE(Q1 = 9 AND Q2 = 9 AND ....)但我认为必须有一个更简单的解决方案。列的名称为Q1,Q2 ...... Q13。

对此有何帮助?

3 个答案:

答案 0 :(得分:3)

最简单的解决方案是使用任何电子表格应用程序在几秒钟内对NOT (Q1 = 9 AND Q2 = 9 AND Q3 = 9 AND Q4 = 9 AND Q5 = 9 AND Q6 = 9 AND Q7 = 9 AND Q8 = 9 AND Q9 = 9 AND Q10 = 9 AND Q11 = 9 AND Q12 = 9 AND Q13 = 9)进行硬编码。

稍快可能是在同一电子表格中生成的等效(Q1 < 9 OR Q2 < 9 OR Q3 < 9 OR Q4 < 9 OR Q5 < 9 OR Q6 < 9 OR Q7 < 9 OR Q8 < 9 OR Q9 < 9 OR Q10 < 9 OR Q11 < 9 OR Q12 < 9 OR Q13 < 9)表达式。

可能的值仅限于[1-5,9],表达式更短但效率更低Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13 < 117

仅供记录,使用的电子表格公式:

    A               B                       C                   D
1   1       ="Q"&A1&" = 9 AND "     ="Q"&A1&" < 9 OR "      ="Q"&A1&"+"
2   2       ="Q"&A2&" = 9 AND "     ="Q"&A2&" < 9 OR "      ="Q"&A2&"+"
...

答案 1 :(得分:2)

另一种方法是使用unpivot技术

SELECT other_cols
FROM   yourtable
       CROSS apply(VALUES (Q1),
                          (Q2),
                          (Q3),
                           ...
                          (Q12),
                          (Q13) ) tc(Q) 
Group by other_cols
Having sum(Q) = 117

答案 2 :(得分:1)

另一种方法是使用UNPIVOT + PIVOT(自SQL Server 2012以来OVER的聚合函数):

SELECT *
FROM (
    SELECT  some_id, 
            Q, 
            CASE WHEN SUM([Values]) OVER (PARTITION BY some_id ORDER BY some_id) < 117 AND [Values] = 9 THEN 3 ELSE [Values] END as [Values]
    FROM YourTable Y
    UNPIVOT (
        [Values] FOR Q in (Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10,Q11,Q12,Q13)
    ) as unpvt
) as p
PIVOT (
    MAX([Values]) FOR [Q] IN (Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10,Q11,Q12,Q13)
) as pvt

因为我在9中获得了一行Q11, Q12, Q13。并且所有9一个,在输出上我将得到

some_id Q1  Q2  Q3  Q4  Q5  Q6  Q7  Q8  Q9  Q10 Q11 Q12 Q13
1       1   2   3   4   5   1   2   3   4   1   3   3   3
2       9   9   9   9   9   9   9   9   9   9   9   9   9