MySQL count (*) возвращает 0, хотя я использовал IFNULL и COALESCE - PullRequest
0 голосов
/ 05 апреля 2020

Вот мой запрос:

USE adventureWorks4mysql;

SELECT  DISTINCT a.city, count(a.city) as "City Count", emp.Gender as Gender, emp.VacationHours as VacationHours, 
(select  if(count(*) is null,0, count(*))
FROM address aa
inner join employeeaddress empad on aa.AddressID = empad.AddressID
inner join employee emp on empad.EmployeeID = emp.EmployeeID
where MaritalStatus = 'M' and aa.city = a.city
group by aa.City) as married,

(select ifnull(count(*),0)
FROM address aa
inner join employeeaddress empad on aa.AddressID = empad.AddressID
inner join employee emp on empad.EmployeeID = emp.EmployeeID
where MaritalStatus = 'S' and aa.city = a.city
group by aa.City)  as single

FROM address a

inner join employeeaddress empad on a.AddressID = empad.AddressID

inner join employee emp on empad.EmployeeID = emp.EmployeeID

group by a.City;

возвращает следующее:

'Bellevue', '36', 'F', '5', '22', '14'
'Berlin', '1', 'F', '35', NULL, '1'
'Bordeaux', '1', 'M', '34', NULL, '1'
'Bothell', '13', 'M', '9', '7', '6'
'Calgary', '1', 'M', '33', '1', NULL
'Cambridge', '2', 'F', '37', '2', NULL
'Carnation', '5', 'M', '77', '4', '1'
'Detroit', '1', 'M', '38', NULL, '1'
'Duluth', '1', 'F', '24', NULL, '1'
'Duvall', '10', 'F', '80', '3', '7'
'Edmonds', '25', 'M', '84', '16', '9'
'Everett', '18', 'M', '42', '11', '7'
'Gold Bar', '5', 'M', '92', '3', '2'
'Index', '5', 'F', '61', '3', '2'
'Issaquah', '15', 'M', '70', '4', '11'
'Kenmore', '12', 'F', '86', '5', '7'
'Kent', '1', 'F', '5', '1', NULL
'Melbourne', '1', 'F', '36', NULL, '1'
'Memphis', '1', 'M', '29', '1', NULL
'Minneapolis', '1', 'M', '48', NULL, '1'
'Monroe', '14', 'M', '21', '4', '10'
'Nevada', '1', 'F', '27', '1', NULL
'Newport Hills', '7', 'M', '44', '2', '5'
'Ottawa', '1', 'M', '31', '1', NULL
'Portland', '1', 'F', '22', NULL, '1'
'Redmond', '21', 'M', '2', '11', '10'
'Renton', '17', 'M', '6', '12', '5'
'Sammamish', '17', 'F', '31', '6', '11'
'San Francisco', '2', 'M', '16', '2', NULL
'Seattle', '44', 'F', '82', '21', '23'
'Snohomish', '10', 'M', '88', '3', '7'

1 Ответ

0 голосов
/ 05 апреля 2020

Не совсем ясно, какой вы хотите получить результат, но пытаетесь ли вы подсчитать города, тогда я предлагаю вам использовать «условные агрегаты» вместо вашего текущего подхода, например:

SELECT 
    a.city
  , COUNT( a.city )   AS "City Count"
  , count(CASE WHEN maritalstatus = 'M' THEN a.city END) AS married
  , count(CASE WHEN maritalstatus = 'S' THEN a.city END) AS single 
FROM address a
INNER JOIN employeeaddress empad ON a.addressid = empad.addressid
INNER JOIN employee emp ON empad.employeeid = emp.employeeid
GROUP BY
    a.city;

Обратите внимание, как выражение case ВНУТРИ агрегатной функции COUNT - отсюда и термин «условные агрегаты», например, для синглов, если есть одиночный статус, то счетчик, который адресует в противном случае, просто игнорирует эту строку. nb COUNT не увеличивается, если значение равно нулю.

Обратите внимание, что вы группируете только по одному столбцу city. Если вам действительно нужно больше строк результатов из-за gender и vacationhours, используйте также эти столбцы в предложении GROUP BY

SELECT 
    a.city
  , emp.gender        AS Gender
  , emp.vacationhours AS VacationHours
  , COUNT( a.city )   AS "City Count"
  , count(CASE WHEN maritalstatus = 'M' THEN a.city END) AS married
  , count(CASE WHEN maritalstatus = 'S' THEN a.city END) AS single 
FROM address a
INNER JOIN employeeaddress empad ON a.addressid = empad.addressid
INNER JOIN employee emp ON empad.employeeid = emp.employeeid
GROUP BY
    a.city
  , emp.gender 
  , emp.vacationhours 
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...