2015-11-11 3 views
-3

Я использую Microsoft SQL 2012Количество истинных и ложных строк в строке

У меня есть таблица с полем Name и несколькими целыми полями.

NAME|field1|field2|field3 

John|1|2|1 

Pat|3|2|1 

John|1|1|2 

То, что я хочу это получить количество всех столбцов с 1 и подсчет всех столбцов с 2 по имени.

  • 1 = Pass
  • 2 = Сбой
  • 3 = Н/А и должен быть проигнорирован

Я хочу мои результаты быть как например:

NAME|PASS|FAIL|ACCURACY 

JOHN|4|2|66.6 

PAT|1|1|50.0 

Каждая строка предназначена для человека, и каждый человек может иметь несколько строк в таблице с оценками для каждого поля. Первый ответ близок к тому, что я искал, за исключением того, что он не группируется человеком. Я никогда не пробовал это раньше и не знал, с чего начать.

Любая помощь будет принята с благодарностью.

Спасибо,

+0

Можете ли вы показать нам, что вы пробовали до сих пор? –

+1

Какая СУБД? SQL-диалекты не все одинаковы. –

+1

Это было бы очень просто с правильным дизайном базы данных, где у вас есть значения в отдельных строках, а не в отдельных столбцах. Подумайте об изменении своей модели. –

ответ

0

Вы должны использовать несколько CASE для каждого поля или IIF если таковые имеются в базе данных

SQL Fiddle

Update после вопроса редактирования потому что вы используете 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 Server 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 
+0

Это именно то, что я ищу, за исключением случаев, когда оно не 1, оно показывает нуль. Например, если у меня есть 2 прохода и 1 Fail, будет показано 0. Если у меня есть 3 прохода и 0 сбой, он показывает 1. – user3455586

+0

проверить мое обновление. Необходимо включить '* 1.0' для преобразования целого числа в float для решения проблемы 0. –

+0

Спасибо. Будет ли на IIF более 10 заявлений? операторы case ограничиваются 10 вложенными операциями. – user3455586

Смежные вопросы