我正在使用Microsoft SQL 2012
我有一个带有Name字段和多个整数字段的表。
col-lg-*
我想要的是获取所有列的计数为1,所有列的计数为2,按NAME计算。
我希望我的结果是这样的:
NAME|field1|field2|field3
John|1|2|1
Pat|3|2|1
John|1|1|2
每一行都是针对一个人的,每个人可以在表格中有多行,每行都有分数。第一个答案接近我所寻找的,除非它不是按人分组。我之前从未尝试过,也不知道从哪里开始。
非常感谢任何协助。
谢谢,
答案 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