Sql 检查一系列列在一行中是否具有相同的值?

Sql 检查一系列列在一行中是否具有相同的值?,sql,sql-server,Sql,Sql Server,我得到了一个包含13列的旧表,其中包含值1-5。它们必须迁移到新的数据库。然而,有些列包含值9,这是不能对此进行评级的虚拟值,我们决定将所有不能对此进行评级的值都转换为3,而不是9 然而,有些行在所有13列中只包含9,我们希望完全跳过这些行,因为它们在总体方案中毫无意义 我可以硬编码一个长代码,其中Q1=9和Q2=9,以及。。。。但我认为必须有一个更简单的解决办法。列的名称为Q1、Q2…Q13 有什么帮助吗?最简单的解决方案是硬编码,而不是Q1=9、Q2=9、Q3=9、Q4=9、Q5=9、Q6=

我得到了一个包含13列的旧表,其中包含值1-5。它们必须迁移到新的数据库。然而,有些列包含值9,这是不能对此进行评级的虚拟值,我们决定将所有不能对此进行评级的值都转换为3,而不是9

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

我可以硬编码一个长代码,其中Q1=9和Q2=9,以及。。。。但我认为必须有一个更简单的解决办法。列的名称为Q1、Q2…Q13


有什么帮助吗?

最简单的解决方案是硬编码,而不是Q1=9、Q2=9、Q3=9、Q4=9、Q5=9、Q6=9、Q7=9、Q8=9、Q9=9、Q10=9、Q11=9、Q12=9和Q13=9,使用任何电子表格应用程序都可以在几秒钟内完成

稍快的可能是在同一电子表格中生成的等效Q1<9或Q2<9或Q3<9或Q4<9或Q5<9或Q6<9或Q7<9或Q8<9或Q9<9或Q10<9或Q11<9或Q12<9或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和=Q&A1&<9或=Q&A1&+ 2 2=Q&A2&=9和=Q&A2&<9或=Q&A2&+ ...
最简单的解决方案是硬编码,而不是Q1=9、Q2=9、Q3=9、Q4=9、Q5=9、Q6=9、Q7=9、Q8=9、Q10=9、Q11=9、Q12=9和Q13=9,使用任何电子表格应用程序都可以在几秒钟内完成

稍快的可能是在同一电子表格中生成的等效Q1<9或Q2<9或Q3<9或Q4<9或Q5<9或Q6<9或Q7<9或Q8<9或Q9<9或Q10<9或Q11<9或Q12<9或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和=Q&A1&<9或=Q&A1&+ 2 2=Q&A2&=9和=Q&A2&<9或=Q&A2&+ ...
另一种方法是使用unpivot技术

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

另一种方法是使用unpivot技术

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

另一种方法是使用UNPIVOT+PIVOT聚合函数,该函数自SQL Server 2012以来一直在运行:

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

另一种方法是使用UNPIVOT+PIVOT聚合函数,该函数自SQL Server 2012以来一直在运行:

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

有时简单的解决方案是最好的;为什么要浪费时间去解决一个已经解决的问题呢?键入此问题应该比实际键入where子句花费更长的时间:编写q1=9 etc查询比在此处发布问题花费更短的时间…为迁移执行的脚本通常只运行一次,并且对于已知的数据库。因此,它们不需要是可维护的、可扩展的和超级漂亮的。我的建议是:按照上面的建议编写where子句。附带说明:如果有很多列,或者需要一个对另一个具有不同列名的表执行相同操作的解决方案,一般的解决方案是使用动态代码生成和来自系统目录视图的数据来生成所需的语句。这可以很容易地作为一个存储procedure@jpw不,这是一次性的事情。一旦我们进行了转换,表就会被删除。有时简单的解决方案是最好的;为什么要浪费时间去解决一个已经解决的问题呢?键入此问题应该比实际键入where子句花费更长的时间:编写q1=9 etc查询比在此处发布问题花费更短的时间…为迁移执行的脚本通常只运行一次,并且对于已知的数据库。因此,它们不需要是可维护的、可扩展的和超级漂亮的。我的建议是:按照上面的建议编写where子句。附带说明:如果有很多列,或者需要一个对另一个具有不同列名的表执行相同操作的解决方案,一般的解决方案是使用动态代码生成和来自系统目录视图的数据来生成所需的语句。这可以很容易地作为一个存储procedure@jpw不,这是一次性的事情。我们完成转换后,该表将立即删除。