MySQL: сделать подзапросы относящимися к группировке (Basi c требуется помощь!) - PullRequest
1 голос
/ 29 марта 2020

Довольно основы c Q, но я только начинаю с MySql и не могу понять, как это сделать. Я пытаюсь обобщить некоторые данные о пикапах, и я хочу разбить их на месяцы, а затем показать столбцы для общего количества пикапов за этот месяц, а также с разбивкой, какие материалы были подобраны. Я пытался сделать это с помощью подзапросов, но он показывает для каждого месяца общее количество сборов с разных типов материалов за все время. Какой самый простой способ решить это. Та!

  SELECT
        DATE_FORMAT(pickup.created_at,'%Y-%m') as 'service_year_month',
        count(pickup.id) as total_pickup_id,
        (SELECT COUNT(*) from pickup WHERE pickup.material = "PAPER") as paper_pickups,
        (SELECT COUNT(*) from pickup WHERE pickup.material = "OTHER") as other_pickups,
        (SELECT COUNT(*) from pickup WHERE pickup.material = "PLASTIC") as plastic_pickups,
        (SELECT COUNT(*) from pickup WHERE pickup.material = "WOOD") as wood_pickups,
        (SELECT COUNT(*) from pickup WHERE pickup.material = "GLAS") as glas_pickups,
        (SELECT COUNT(*) from pickup WHERE pickup.material = "METAL") as metal_pickups
    FROM
        pickup
        left join container on
        pickup.container_id = container.id
    WHERE
        container.pickup_mode = 'ON_DEMAND'
    group by service_year_month
    order by service_year_month desc;

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

используйте СУММУ вместо СЧЕТА Это дает вам число в месяц

  SELECT
        DATE_FORMAT(pickup.created_at,'%Y-%m') as 'service_year_month',
        count(pickup.id) as total_pickup_id,
        SUM(pickup.material = "PAPER") as paper_pickups,
        SUM(pickup.material = "OTHER") as other_pickups,
        SUM(pickup.material = "PLASTIC") as plastic_pickups,
        SUM(pickup.material = "WOOD") as wood_pickups,
        SUM(pickup.material = "GLAS") as glas_pickups,
        SUM(pickup.material = "METAL") as metal_pickups
    FROM
        pickup
        left join container on
        pickup.container_id = container.id
    WHERE
        container.pickup_mode = 'ON_DEMAND'
    group by service_year_month
    order by service_year_month desc;
0 голосов
/ 29 марта 2020

Вы можете сделать это с условным агрегированием:

SELECT
  DATE_FORMAT(p.created_at,'%Y-%m') AS service_year_month,
  COUNT(p.id) AS total_pickup_id,
  SUM(p.material = 'PAPER') AS paper_pickups,
  SUM(p.material = 'OTHER') AS other_pickups,
  SUM(p.material = 'PLASTIC') AS plastic_pickups,
  SUM(p.material = 'WOOD') AS wood_pickups,
  SUM(p.material = 'GLAS') AS glas_pickups,
  SUM(p.material = 'METAL') AS metal_pickups
FROM pickup p LEFT JOIN container c
ON p.container_id = c.id AND c.pickup_mode = 'ON_DEMAND'
GROUP BY service_year_month
ORDER BY service_year_month desc;

Также используйте псевдонимы для таблиц, чтобы сократить код и сделать его более читабельным. Я переместил условие:

c.pickup_mode = 'ON_DEMAND'

в предложение ON, так как при использовании его в предложении WHERE соединение заменяется на INNER JOIN.

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