每行的真假数

时间:2015-11-11 20:15:47

标签: sql count

我正在使用Microsoft SQL 2012

我有一个带有Name字段和多个整数字段的表。

col-lg-*

我想要的是获取所有列的计数为1,所有列的计数为2,按NAME计算。

  • 1 =通过
  • 2 =失败
  • 3 = N / A,将被忽略

我希望我的结果是这样的:

NAME|field1|field2|field3

John|1|2|1

Pat|3|2|1

John|1|1|2

每一行都是针对一个人的,每个人可以在表格中有多行,每行都有分数。第一个答案接近我所寻找的,除非它不是按人分组。我之前从未尝试过,也不知道从哪里开始。

非常感谢任何协助。

谢谢,

1 个答案:

答案 0 :(得分:0)

您必须为每个字段使用多个CASE,或者在数据库中使用IIF

<强> SQL Fiddle

问题编辑后更新,因为您现在使用SQL Server我使用CTE清除

With field_group as (
    SELECT NAME, 
           CASE field1 WHEN 1 THEN 1 ELSE 0 END +
           CASE field2 WHEN 1 THEN 1 ELSE 0 END +
           CASE field3 WHEN 1 THEN 1 ELSE 0 END AS Pass,

           CASE field1 WHEN 2 THEN 1 ELSE 0 END +
           CASE field2 WHEN 2 THEN 1 ELSE 0 END +
           CASE field3 WHEN 2 THEN 1 ELSE 0 END AS Fail
     FROM Table1
),
name_total as (
    SELECT NAME, SUM(Pass) pass, SUM(Fail) as fail
    FROM field_group
    GROUP BY NAME
)
SELECT *,
       CASE WHEN (pass + fail) > 0 THEN pass * 1.0 / (pass + fail)
       END as Accurancy
FROM name_total;

<强>输出

| NAME | pass | fail |      Accurancy |
|------|------|------|----------------|
| John |    4 |    2 | 0.666666666666 |
|  Pat |    1 |    1 |            0.5 |

在sql 2012中,你可以使用类似的东西

SELECT ID, 
       IIF( field1 = 1, 1, 0) +
       IIF( field2 = 1, 1, 0) +
       IIF( field3 = 1, 1, 0) AS PASS,
       IIF( field1 = 2, 1, 0) +
       IIF( field2 = 2, 1, 0) +
       IIF( field3 = 2, 1, 0) AS FAIL
 FROM Table1