SQL Server-使用计数总和

SQL Server-使用计数总和,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我正在使用SQL Server。我需要使用的公式是好/坏/总回答。好的是当值>=9时,坏的是这是否起作用 SELECT Date, CAST((SUM(CASE WHEN ISNUMERIC(Q1) != 1 THEN 0 WHEN CAST(Q1 AS int) >= 9 THEN 1 WHEN CAST(Q1 AS int) <= 6 THEN -1 ELSE

我正在使用SQL Server。我需要使用的公式是好/坏/总回答。好的是当值>=9时,坏的是这是否起作用

SELECT  Date,
        CAST((SUM(CASE WHEN ISNUMERIC(Q1) != 1 THEN 0
                 WHEN CAST(Q1 AS int) >= 9 THEN 1
                 WHEN CAST(Q1 AS int) <= 6 THEN -1
                 ELSE 0 END)
        + SUM(CASE WHEN ISNUMERIC(Q2) != 1 THEN 0
                 WHEN CAST(Q2 AS int) >= 9 THEN 1
                 WHEN CAST(Q2 AS int) <= 6 THEN -1
                 ELSE 0 END)) AS float)
        / (SUM(CASE WHEN ISNUMERIC(Q1) != 1 THEN 0
                   ELSE 1 END)
        + SUM(CASE WHEN ISNUMERIC(Q2) != 1 THEN 0
                   ELSE 1 END))
FROM    Questions
GROUP BY Date

或者,如果“NA”是唯一的非数字值,请明确测试它。

Buildin on@DavidM answer,我添加了浮点转换和Q2列感知:

SELECT [date], 
1e0 -- a float multiplier to avoid integer value
* SUM( 0
    -- get the positive, negative or neutral from q1
    + CASE WHEN ISNUMERIC(q1) != 1 THEN  0
    WHEN CAST(q1 AS int) >= 9    THEN  1
    WHEN CAST(q1 AS int) <= 6    THEN -1
    ELSE 0 END
    -- get the positive, negative or neutral from q2
    + CASE WHEN ISNUMERIC(q2) != 1 THEN  0
    WHEN CAST(q2 AS int) >= 9    THEN  1
    WHEN CAST(q2 AS int) <= 6    THEN -1
    ELSE 0 END
)
/ SUM( 0
    -- get the number of valid questions from q1
    + CASE WHEN ISNUMERIC(q1) != 1 THEN 0 ELSE 1 END        
    -- get the number of valid questions from q2
    + CASE WHEN ISNUMERIC(q2) != 1 THEN 0 ELSE 1 END
)
FROM Questions
GROUP BY Date;

为什么是NVARCHAR?你想储存货币、英镑符号和希伯来语吗?小心数字。。。它并不总是做你认为它应该做的事情。为了说明@JeremyHolovacs的观点,我在2002年写了这篇文章,今天仍然相关:@AaronBertrand你能马上知道IsNumericQ1+'.0e0'=1是否捕捉到所有相同的值是真正的数值捕捉吗?我一直在使用@Conrad的所有有效整数,我想是的,但不是100%确定,因为我还没有测试。我得到的结果是:2012-03-04 | 0-你需要小心整数数学。你试过你的代码吗?@Aaron-就像你说的,它在做整数除法。修正了,看近一点。就在那里。第9行。只有分子或分母需要强制浮点除法,我相信你们都知道。语法不正确。强烈建议您在发布15个更新之前让代码正常工作。DOUBLE在SQL Server中不是有效的数据类型。我更倾向于将其视为对工作解决方案的迭代;公正的评论。两个快速评论1你的最后一个ISNUMERIC检查不应该是针对第二季度的吗?我认为它目前只起作用,因为两列都有相同的行数,通过或不通过检查2。我认为依赖ISNUMERIC是危险的,因为任何旧垃圾都可以输入该列。如果OP确认“NA”是唯一可能的非数值,则显式检查该值比依赖ISNUMERIC更安全。确定@AaronBertrand:1为错误类型,并已更正;2如果只考虑“NA”值,那么如何处理其他垃圾值?我不建议在VARCHAR上保存数字数据,但这是@Brad提出的问题的一部分。
SELECT  Date,
        CAST((SUM(CASE WHEN ISNUMERIC(Q1) != 1 THEN 0
                 WHEN CAST(Q1 AS int) >= 9 THEN 1
                 WHEN CAST(Q1 AS int) <= 6 THEN -1
                 ELSE 0 END)
        + SUM(CASE WHEN ISNUMERIC(Q2) != 1 THEN 0
                 WHEN CAST(Q2 AS int) >= 9 THEN 1
                 WHEN CAST(Q2 AS int) <= 6 THEN -1
                 ELSE 0 END)) AS float)
        / (SUM(CASE WHEN ISNUMERIC(Q1) != 1 THEN 0
                   ELSE 1 END)
        + SUM(CASE WHEN ISNUMERIC(Q2) != 1 THEN 0
                   ELSE 1 END))
FROM    Questions
GROUP BY Date
SELECT [date], 
1e0 -- a float multiplier to avoid integer value
* SUM( 0
    -- get the positive, negative or neutral from q1
    + CASE WHEN ISNUMERIC(q1) != 1 THEN  0
    WHEN CAST(q1 AS int) >= 9    THEN  1
    WHEN CAST(q1 AS int) <= 6    THEN -1
    ELSE 0 END
    -- get the positive, negative or neutral from q2
    + CASE WHEN ISNUMERIC(q2) != 1 THEN  0
    WHEN CAST(q2 AS int) >= 9    THEN  1
    WHEN CAST(q2 AS int) <= 6    THEN -1
    ELSE 0 END
)
/ SUM( 0
    -- get the number of valid questions from q1
    + CASE WHEN ISNUMERIC(q1) != 1 THEN 0 ELSE 1 END        
    -- get the number of valid questions from q2
    + CASE WHEN ISNUMERIC(q2) != 1 THEN 0 ELSE 1 END
)
FROM Questions
GROUP BY Date;