Подсчет и группировка SQL Данные таблицы сервера - PullRequest
0 голосов
/ 18 июня 2020

У меня есть такая таблица attempts с сотнями или записями. Он записывает некоторые транзакции. Имя транзакции важно, и ошибка говорит о том, что транзакция не была успешной.

| id | name  |error| data |
|----|-------|-----|------|
|   1| sara  | 0   |  bla |   
|   2| sara  | 1   |  bla |
|   3| sara  | 0   |  bla |
|   4| john  | 1   |  bla |
|   5| paul  | 0   |  bla |
|   6| paul  | 0   |  bla |
|   7| john  | 0   |  bla |

Что я хочу сделать, чтобы получить ошибку и процент успеха, сгруппировав их по «имени». Так, например, для имени «Сара» у меня есть три транзакции: две успешные (потому что ошибка равна 0 (ложь)) и 1 не удалась (потому что ошибка равна 1 (истина)). Я хочу получить процент успеха или ошибки.

  • Вероятность успеха - 2 из 3
  • Частота ошибок - 1 из 3

Я немного запутался, потому что не знаю как именно это сделать:

SELECT  COUNT(id) AS 'count', name, error 
FROM attempts
GROUP BY name, error
ORDER BY  name

Запрос возвращает набор результатов, подобный этому:

|count| name  |error|
|----|-------|-----|
|   2| sara  | 0   |   
|   1| sara  | 1   |  
|   1| john  | 1   | 
|   1| john  | 0   |  
|   2| paul  | 0   | 

, но я не знаю, как я могу рассчитать скорость, я хочу, чтобы примерно так

|count| name |error|success| 
|----|-------|-----|-------|
|   3| sara  | 1   |   2   |
|   2| john  | 1   |   1   | 
|   1| paul  | 0   |   1   | 

Кто-нибудь может мне помочь?

Ответы [ 3 ]

1 голос
/ 18 июня 2020

Вы можете использовать агрегацию:

select name, count(*), sum(error) as error, sum(1 - error) as success
from attempts
group by name;

Если вам нужен показатель успеха, вы можете использовать:

avg( 1.0 - error ) as success_rate
0 голосов
/ 18 июня 2020

Пожалуйста, запустите приведенный ниже код. Вы получите желаемый результат. Первая часть предназначена для вставки данных в таблицу #tmp.

-----------insert data into #tmp table
select *
into #tmp
from (
    Select 1 as id, 'sara' as name, 0 as error, 'bla' as data
    union all
    Select 2 as id, 'sara' as name, 1 as error, 'bla' as data
    union all
    Select 3 as id, 'sara' as name, 0 as error, 'bla' as data
    union all
    Select 4 as id, 'john' as name, 1 as error, 'bla' as data
    union all
    Select 5 as id, 'paul' as name, 0 as error, 'bla' as data
    union all
    Select 6 as id, 'paul' as name, 0 as error, 'bla' as data
    union all
    Select 7 as id, 'john' as name, 0 as error, 'bla' as data
)r
select * from #tmp
--------------Main ans starts here-------------
select r.cnt as Count, r.Name as Name, r.er as Error, r.cnt-r.er as Success from (
    select count(*) as cnt, name, sum(error)er
    from #tmp
    group by name
) r
order by count desc
--------------end here-------------
0 голосов
/ 18 июня 2020

Попробуйте следующее.

select name, cont(*), sum(case when error=1 then 1 else 0 end) as error, sum(case when error=0 then 1 else 0 end) as success from attempts group by name;

...