我有一个包含13列的遗留表,其值为1-5。必须将它们迁移到新数据库。然而,一些列保持值9,这是"的虚拟值,不能对此进行评级"我们决定所有"不能评价这个"值应该变为3而不是9。
然而,有些行在所有13列中只包含9个,我们希望完全跳过这些行,因为它们在宏观方案中毫无意义。
我可以硬编码一个长的" WHERE(Q1 = 9 AND Q2 = 9 AND ....)但我认为必须有一个更简单的解决方案。列的名称为Q1,Q2 ...... Q13。
对此有何帮助?
答案 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