Получить средние пустые поля в запросе - PullRequest
1 голос
/ 09 июня 2011

Я пытаюсь получить среднее значение не пустых полей в запросе.Прямо сейчас я делаю:

select COUNT(name) as name
,COUNT(surname) as surname  
    ,COUNT(email) as email from table where id = 1

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

Спасибо!

РЕДАКТИРОВАТЬ ПРИМЕР

результат запроса:

Name       Surname     Email
-----------------------------
John       Lennon      NULL
Mary       NULL        NULL
Peter      Clock       222@aa.com

всего полей: 9 пустых полей: 6

среднее число пустых полей: 6/9 = 0,66 -> 66% То, что я хочу

извините за непонятность

Ответы [ 4 ]

1 голос
/ 09 июня 2011
  • COUNT (*) дает просто количество строк
  • 3 * COUNT (*) дает количество элементов в таблице
  • COUNT (colname) дает ненулевые значения в этом столбце
  • COUNT (colname1) + COUNT (colname2) + COUNT (colname3) дает все ненулевые значения

Все остальное - базовая арифметика с некоторыми неявными преобразованиями десятичных чисел / чисел с плавающей точкой для устранения проблем целочисленного деления

select
   100.0 * 
   (
      COUNT(name) + COUNT(surname) + COUNT(email)
   )
   /
   (
       3 * COUNT(*)
   )
from
   table where id = 1
1 голос
/ 09 июня 2011

Непонятно, что вы хотите, но просто угадайте, попробуйте:

select (COUNT(name) + COUNT(surname) + COUNT(email)) / 3 from table;
1 голос
/ 09 июня 2011

Я думаю, что это очень неэффективный способ, но его легко понять, так что побейте меня :)

DECLARE @TotalCount NUMERIC(5, 2)
DECLARE @NullNameCount NUMERIC(5, 2)
DECLARE @NullSurnameCount NUMERIC(5, 2)
DECLARE @NullEmailCount NUMERIC(5, 2)

SELECT @TotalCount = COUNT(0) FROM Table

SELECT @NullNameCount = COUNT(0) FROM Table WHERE Name IS NOT NULL
SELECT @NullSurnameCount = COUNT(0) FROM Table WHERE Surname IS NOT NULL
SELECT @NullEmailCount = COUNT(0) FROM Table WHERE Email IS NOT NULL

SELECT CAST((((@NullNameCount + @NullSurnameCount + @NullEmailCount) / @TotalCount) * 100.00) AS NUMERIC(5, 2))
0 голосов
/ 09 июня 2011

Выберите avg (field_a) из таблицы_xxx где field_a не является нулевым группировать по идентификатору Это даст вам хороший пример? Я спрашиваю об этом, потому что упомянутый вами запрос выглядит странно (нормализована ли ваша таблица?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...