SQL Server-使用计数总和
我正在使用SQL Server。我需要使用的公式是好/坏/总回答。好的是当值>=9时,坏的是这是否起作用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
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;