Conditional sum in SQL Server

给你一囗甜甜゛ 提交于 2019-12-23 09:29:32

问题


I have this table in MSSQL:

ID   OP1   OP2  OP3
330   0     0    1
331   1     0    0
332   3     2    0

OP's are options. There can go from 1 to 9, 0 means that question was not answer.

How can i "sum" in a column called "Answered", like so:

ID   OP1   OP2  OP3  T
330   0     0    1   1
331   1     0    0   1
332   3     2    0   2

A value over 0, means answered.

I try with CASE WHEN, IF statements.


回答1:


Use CASE:

SELECT Id, OP1, OP2, OP3, 
       (CASE WHEN OP1 > 0 THEN 1 ELSE 0 END +
        CASE WHEN OP2 > 0 THEN 1 ELSE 0 END +
        CASE WHEN Op3 > 0 THEN 1 ELSE 0 END) AS T
FROM MyTable



回答2:


Less cumbersome than case. SIGN gives 1 for a value > 0

SELECT
   ID,
   OP1,OP2,OP3,
   SIGN(OP1) + SIGN(OP2) + SIGN(OP3) AS T
FROM
   OPTABLE

Edit, May 2013. Actually, this can be simpler with

SIGN(OP1+OP2+OP3) AS T



回答3:


Others have answered your question, but ideally you wouldn't store your data like that.

This table would be better:

id   op   value
330  1    0
330  2    0
330  3    1
331  1    1
331  2    0
331  3    0
332  1    3
332  2    2
332  3    0

Then you can get the sum for an ID with a simpler query:

SELECT COUNT(*) AS T FROM table WHERE id = x AND VALUE > 0

It also scales better should you choose to add more options, and provides an easier way to data drive queries about particular option values.




回答4:


how about the following:

SELECT ID,
       OP1,
       OP2,
       OP3,
       CASE WHEN OP1 = 0 THEN 0 ELSE 1 END + 
       CASE WHEN OP2 = 0 THEN 0 ELSE 1 END +
       CASE WHEN OP3 = 0 THEN 0 ELSE 1 END AS T

EDIT:




回答5:


Try this:

SELECT ID,OP1,OP2,OP3,(OP1+OP2+OP3) AS T FROM OPTABLE


来源:https://stackoverflow.com/questions/6779196/conditional-sum-in-sql-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!