Мне интересно, как написать этот запрос.
Я знаю, что этот фактический синтаксис фальшивый, но он поможет вам понять, чего я хочу. Мне нужно это в этом формате, потому что это часть гораздо большего запроса.
SELECT distributor_id,
COUNT(*) AS TOTAL,
COUNT(*) WHERE level = 'exec',
COUNT(*) WHERE level = 'personal'
Мне нужно, чтобы все это возвращалось в одном запросе.
Кроме того, он должен быть в одном ряду, поэтому следующее не будет работать:
'SELECT distributor_id, COUNT(*)
GROUP BY distributor_id'
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'
Ответы:
Вы можете использовать
CASE
оператор с агрегатной функцией. Это в основном то же самое, что иPIVOT
функция в некоторых RDBMS:источник
COUNT
будет считатьdistributor_id
мудрым. не все строки таблицы, верно?Один способ, который работает наверняка
РЕДАКТИРОВАТЬ:
См. Снижение производительности @ KevinBalmforth, чтобы узнать, почему вы, вероятно, не хотите использовать этот метод и вместо этого должны выбрать ответ @ Taryn ♦. Я оставляю это, чтобы люди могли понять их варианты.
источник
sum(case...)
решение должно быть рассмотрено.group by
с выгодой замены целого вложенного запроса простым,count(*)
как показывает @Mihai, - с дополнительными упрощениями синтаксиса в MySQL.COUNT
только подсчитываетnon null
значения иDECODE
возвращает ненулевое значение,1
только если ваше условие выполнено.источник
distributor_id
будет показывать запрос? Всего показано 1 строка.Опираясь на другие опубликованные ответы.
Оба из них будут производить правильные значения:
Тем не менее, производительность сильно отличается, что, очевидно, будет более актуальным по мере роста количества данных.
Я обнаружил, что, предполагая, что индексы не определены в таблице, запрос, использующий суммы SUM, будет выполнять сканирование одной таблицы, в то время как запрос с COUNT будет выполнять сканирование нескольких таблиц.
В качестве примера запустите следующий скрипт:
Выделите 2 оператора SELECT и щелкните значок «Показать примерный план выполнения». Вы увидите, что первый оператор выполнит одно сканирование таблицы, а второй - 4. Очевидно, одно сканирование таблицы лучше, чем 4.
Добавление кластерного индекса также интересно. Например
Первый SELECT выше выполнит одно сканирование кластерного индекса. Второй SELECT выполнит 4 поиска кластеризованных индексов, но они все еще дороже, чем одно сканирование кластеризованных индексов. Я попробовал то же самое в таблице с 8 миллионами строк, а второй SELECT все еще был намного дороже.
источник
Для MySQL это можно сократить до:
источник
Ну, если вам нужно все это в одном запросе, вы можете сделать объединение:
Или, если вы можете сделать после обработки:
Вы получите счет для каждого уровня и должны суммировать их все, чтобы получить общее количество.
источник
UNION
очень полезным при создании отчета, содержащего несколько экземпляровCOUNT(*)
функции.#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') FROM distributors UNION SELECT COUNT() AS EXEC_COUNT FROM distributors WHERE ' at line 1
.Я делаю что-то вроде этого, где я просто даю каждой таблице имя строки, чтобы идентифицировать ее в столбце A, и счет для столбца. Затем я объединяю их всех, чтобы они сложились. На мой взгляд, результат довольно хороший - я не уверен, насколько он эффективен по сравнению с другими вариантами, но он дал мне то, что мне было нужно.
Результат:
источник
a query that I created makes ...
- где этот запрос?На основании принятого ответа Bluefeet с добавленным нюансом, используя
OVER()
:Использование
OVER()
с нулем в () даст вам общее количество для всего набора данных.источник
Я думаю, что это может также работать для вас
select count(*) as anc,(select count(*) from Patient where sex='F')as patientF,(select count(*) from Patient where sex='M') as patientM from anc
а также вы можете выбирать и считать связанные таблицы, как это
select count(*) as anc,(select count(*) from Patient where Patient.Id=anc.PatientId)as patientF,(select count(*) from Patient where sex='M') as patientM from anc
источник