Можно ли использовать агрегатные функции с объединением? - PullRequest
0 голосов
/ 29 апреля 2020
  • таблица проектов: pid (pk), имя ...
  • категории таблиц: pid (pk), проект (pid проекта), родительский (pid другой категории) ...
  • количество таблиц: проект (pid проекта), категория (pid категории), count ...

Я использовал этот запрос раньше

SELECT
categories.*, projects.pid, projects.name, parent_category.*
FROM categories
INNER JOIN projects ON projects.pid = categories.project
LEFT JOIN categories AS parent_category ON parent_category.pid = categories.parent

, и он работал хорошо

На этот раз нам нужны данные SUM, COUNT. Поэтому я добавил таблицу «count» и сделал этот запрос.

SELECT
categories.*, projects.pid, projects.name, SUM(counts.count), COUNT(counts.count),
parent_category.*, SUM(parent_category_count.count), COUNT(parent_category_count.count)
FROM categories
INNER JOIN projects ON projects.pid = categories.project
LEFT JOIN counts ON counts.category = categories.pid
LEFT JOIN categories AS parent_category ON parent_category.pid = categories.parent
LEFT JOIN counts AS parent_category_count ON parent_category_count.category = categories.pid

Тогда я получаю

ОШИБКА: вызовы агрегатных функций не могут быть вложенными

Что я могу сделать? Имеет ли этот запрос смысл? Или я должен разделить это?

1 Ответ

1 голос
/ 29 апреля 2020

Вы должны добавить правильное предложение GROUP BY (в вашем случае это должен быть category.pid)

    SELECT
    categories.*
    , projects.pid
    , projects.name
    , SUM(counts.count)
    , COUNT(counts.count)
    , parent_category.*
    , SUM(parent_category_count.count)
    , COUNT(parent_category_count.count)
    FROM categories
    INNER JOIN projects ON projects.pid = categories.project
    LEFT JOIN counts ON counts.category = categories.pid
    LEFT JOIN categories AS parent_category ON parent_category.pid = categories.parent
    LEFT JOIN counts AS parent_category_count ON parent_category_count.category = categories.pid
    GROUP BY categories.pid 

или как в вашем комментарии

    SELECT
    categories.*
    , projects.pid
    , projects.name
    , SUM(counts.count)
    , COUNT(counts.count)
    , parent_category.*
    , SUM(parent_category_count.count)
    , COUNT(parent_category_count.count)
    FROM categories
    INNER JOIN projects ON projects.pid = categories.project
    LEFT JOIN counts ON counts.category = categories.pid
    LEFT JOIN categories AS parent_category ON parent_category.pid = categories.parent
    LEFT JOIN counts AS parent_category_count ON parent_category_count.category = categories.pid
    GROUP BY categories.pid, projects.pid, parent_category.pid
...