SQL: неверный счетчик в пустом столбце - PullRequest
0 голосов
/ 11 января 2019

MySQL SQL не возвращает правильное количество для записей, которые имеют нулевые и ненулевые значения

У меня есть следующие значения в таблице с тремя столбцами (код, сумма, имя)

"AMPF";"0.1000";"Amplify Inc";
"AMPF";"0.1000";"Amplify Inc";
"AMPF";"0.2000";"Amplify Inc";
"AMPF";"0.2000";"Amplify Inc";
"AMPF";"0.3000";"Amplify Inc";
"AMPF";"0.3000";"";
"AMPF";"0.4000";"";
"XYZA";"0.1000";"PeterPal Inc";
"XYZA";"0.1000";"PeterPal Inc"

Я выполняю следующий запрос, чтобы подобрать количество записей, которые существуют для определенного кода элемента. ВЫБЕРИТЕ код, имя, количество (amt) как cnt ИЗ группы таблиц по порядку кода по cnt desc limit 30

SELECT code, name, count(amt) as cnt FROM table group by code order by cnt desc limit 30

В идеале ожидаемый результат должен быть:

AMPF,Amplify Inc,7
XYZA,PeterPal Inc,2

Но вместо этого это приводит к:

AMPF,Amplify Inc,5
XYZA,PeterPal Inc,2

Это указывает на то, что, хотя я беру счетчик в столбце amt, он каким-то образом принимает его в столбце имени, который равен нулю в записях № 6 и 7. Есть мысли о том, что не так в моем коде?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

К сожалению, это условие не имеет прямого ответа. По своей сути функция MySQL count () фактически учитывает ТОЛЬКО значения NOT NULL. Тем не менее, есть следующие два обходных пути, которые могут быть реализованы:

Во-первых, можно запустить отдельный оператор SQL для подсчета записей, которые имеют значение NULL.

Во-вторых, если одно (или несколько) из желаемых значений доступны в другой таблице через внешний ключ, возьмите эти значения из другой таблицы и выполните подсчет в первой таблице, чтобы получить правильный счет.

PS: я использовал первый для своих нужд.

0 голосов
/ 11 января 2019

Во-первых, просто используйте count(*):

SELECT code, MAX(name) as name, count(*) as cnt
FROM table 
GROUP BY code 
ORDER BY cnt desc 
LIMIT 30;

Что происходит, так это то, что значения, которые выглядят как 'AMPF', на самом деле не 'AMPF', то есть они не равны. Я не знаю почему. Это могут быть пробелы в начале кода, это могут быть одинаковые символы в разных наборах символов, это могут быть скрытые символы.

Если вы посмотрите дальше вниз по списку, вы должны увидеть подсчет других кодов - если вы пропустите LIMIT.

Я также изменил SELECT, поэтому NAME не берется из неопределенного ряда. При этом просто используется найденное значение MAX().

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