【问题标题】:Count of true and false per row [closed]每行的真假计数[关闭]
【发布时间】:2015-11-11 20:15:47
【问题描述】:

我正在使用 Microsoft SQL 2012

我有一个包含名称字段和多个整数字段的表。

NAME|field1|field2|field3

John|1|2|1

Pat|3|2|1

John|1|1|2

我想要的是通过 NAME 获取所有 1 列的计数和所有 2 列的计数。

  • 1 = 通过
  • 2 = 失败
  • 3 = 不适用,将被忽略

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

NAME|PASS|FAIL|ACCURACY

JOHN|4|2|66.6

PAT|1|1|50.0   

每一行代表一个人,每个人在表格中可以有多个行,其中包含每个字段的分数。第一个答案与我正在寻找的答案很接近,只是它没有按人分组。我以前从未尝试过,也不知道从哪里开始。

任何帮助将不胜感激。

谢谢你,

【问题讨论】:

  • 你能告诉我们你到目前为止的尝试吗?
  • 哪个 DBMS? SQL 方言不尽相同。
  • 如果数据库设计得当,您可以将值放在单独的行而不是单独的列中,这将非常容易。考虑改变你的模型。

标签: sql count


【解决方案1】:

您必须为每个字段使用多个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

【讨论】:

  • 这正是我正在寻找的,除非它不是 1 时显示为零。例如,如果我有 2 次通过和 1 次失败,将显示 0。如果我有 3 次通过并且 0 次失败,则显示 1。
  • 检查我的更新。必须包含 *1.0 才能将整数转换为浮点数以解决 0 问题。
  • 谢谢。 IIF 会考虑超过 10 个报表吗? case 语句限制为 10 个嵌套语句。
  • 不知道你的意思,为此你不需要嵌套语句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多