@Depleted

Почему COUNT неправильно считает?

PeopleTable (около 500 000 строк)
id | name | gender -- "М" /  "Ж" / NULL
ListTable (около 10 000 000 строк)
id | userID | date

Посчитать количество строк в ListTable, где userID принадлежит мужчинам/женщинам.
Пробовал:
SELECT COUNT(list.id) AS men 
  FROM ListTable AS list 
    LEFT JOIN PeopleTable AS people ON (list.userID = people.id) 
  WHERE people.gender = 'М'". 
  ... 
  WHERE people.gender = 'Ж'

Но сумма больше, чем количество строк в таблице ListTable примерно на 15%.
  • Вопрос задан
  • 137 просмотров
Решения вопроса 2
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Попробуйте:
SELECT 
	COUNT(DISTINCT CASE WHEN people.gender = 'M' THEN list.id END) AS mens,
	COUNT(DISTINCT CASE WHEN people.gender = 'F' THEN list.id END) AS womens,
	COUNT(DISTINCT CASE WHEN people.gender IS NULL THEN list.id END) AS unknown
FROM ListTable AS list 
LEFT JOIN PeopleTable AS people ON (list.userID = people.id) 
;


MS SQL Fiddle
Ответ написан
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
SELECT PeopleTable.gender, COUNT(*) AS GenderCount
  FROM ListTable 
    INNER JOIN PeopleTable ON ListTable.userID = PeopleTable.id
  GROUP BY PeopleTable.gender

А если нужен и ListTable, у которых нет соответствия в PeopleTable
SELECT ISNULL(PeopleTable.gender, '-') [Пол], COUNT(*) [К-во]
  FROM ListTable 
    LEFT JOIN PeopleTable ON ListTable.userID = PeopleTable.id
  GROUP BY ROLLUP (PeopleTable.gender)
UNION
SELECT ' ', COUNT(*)
  FROM ListTable   
ORDER BY 1 DESC, 2

Две последние строчки показывают общее количество. Если они не совпадают выполните проверку. Руководство.
DBCC CHECKTABLE ('PeopleTable')
DBCC CHECKTABLE ('ListTable')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
LEFT JOIN. Значит вы в обоих случаях учитываете строки из ListTable, для которых нет соответcтвующей записи в PeopleTable.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы