присоединиться к MySQL, выбрать запросы как 1, а затем сгруппировать по - PullRequest
0 голосов
/ 26 ноября 2018

Используя информацию этого сайта, я смог выполнить объединение, но у меня возникли проблемы, делающие группу по

, есть ли способ заставить приведенные ниже операторы работать как 1

Query1

SELECT count(location),date 
from `filter` 
where location != "red" 
group by date 

Query2

SELECT count(location),date 
from `filter` 
where location = "red" 
group by date 

Я пробовал ниже, но он выводит неверные данные

Query3

SELECT 
date,
(select count(location) from `filter` where location != "red") AS indoor, 
(select count(location) from `filter` where location = "red") AS outdoor
from `filter` group by date;

SQL Fiddle длякаждый запрос

http://sqlfiddle.com/#!9/17ebea/4 (query1)

http://sqlfiddle.com/#!9/17ebea/6 (query2)

http://sqlfiddle.com/#!9/90c945/1 (query3)

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018
SELECT 
    date,
    COUNT(CASE WHEN location <> 'red' THEN location ELSE NULL END) AS indoor,
    COUNT(CASE WHEN location = 'red' THEN location ELSE NULL END) AS outdoor
FROM filter 
GROUP BY date;

https://dev.mysql.com/doc/refman/8.0/en/control-flow-functions.html#operator_case

0 голосов
/ 26 ноября 2018

В MySQL я бы использовал ярлык, который позволяет вам sum() логические переменные:

select date, sum(location = 'red') as red,
       sum(location <> 'red') as not_red
from filter 
group by date ;

Примечания:

  • Использовать одинарные кавычки для констант строки и даты -- не двойные кавычки.Одинарные кавычки являются стандартным разделителем.
  • <> является оператором неравенства SQL, хотя != также поддерживается большинством баз данных.
  • Это не учитывает значения NULL.

Для обработки NULL значений вам может потребоваться:

       sum(not location <=> 'red') as not_red
0 голосов
/ 26 ноября 2018

Вы можете выполнить условное агрегирование, используя выражения CASE.. WHEN.

SELECT 
  date,
  COUNT(CASE WHEN location = 'red' THEN location END) AS outdoor,
  COUNT(CASE WHEN location <> 'red' THEN location END) AS indoor
FROM `filter` 
GROUP BY date;

Просмотр на скрипте БД

Результат

| date       | outdoor | indoor |
| ---------- | ------- | ------ |
| 2018-11-14 | 1       | 4      |
| 2018-11-15 | 1       | 0      |
| 2018-11-16 | 0       | 3      |
| 2018-11-17 | 1       | 1      |
| 2018-11-18 | 0       | 1      |
| 2018-11-19 | 0       | 2      |
| 2018-11-20 | 0       | 1      |

Вы также можете использовать следующие другие варианты, например, использовать COUNT(1) или использовать функцию SUM(..).

Альтернатива # 1

SELECT 
  date,
  COUNT(CASE WHEN location = 'red' THEN 1 END) AS outdoor,
  COUNT(CASE WHEN location <> 'red' THEN 1 END) AS indoor
FROM `filter` 
GROUP BY date;

Альтернатива # 2

SELECT 
  date,
  SUM(CASE WHEN location = 'red' THEN 1 ELSE 0 END) AS outdoor,
  SUM(CASE WHEN location <> 'red' THEN 1 ELSE 0 END) AS indoor
FROM `filter` 
GROUP BY date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...