Столбец должен появиться в предложении GROUP BY или использоваться в статистической функции - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть этот запрос, который LEFT JOIN между двумя таблицами и суммой суммы

SELECT
    l.code,
    SUM(p.amount)
FROM
    locations l
LEFT JOIN payments p 
ON p.location_code = l.code
GROUP by l.code

Он работает правильно, и это вывод

enter image description here

Прямо сейчас я хочу выбрать больше столбца, пример имени местоположения

SELECT
    l.code,
    l.location.name,
    SUM(p.amount)
FROM
    locations l
LEFT JOIN payments p 
ON p.location_code = l.code
GROUP by l.code

Однако я столкнулся с этой ошибкой

Query 1 ERROR: ERROR:  column "l.location_name" must appear in the GROUP BY clause or be used in an aggregate function
LINE 3:  l.location_name,

Добавление location_name в GROUP BY не является вариантомесли мне нужно выбрать больше столбцов в будущем.

Как мне изменить запрос, чтобы он поддерживал выбор дополнительных столбцов?

БД скрипта:

https://dbfiddle.uk/?rdbms=postgres_11&fiddle=4485d0b1d37b8b476f3f513649a6ebfb

Спасибо

Ответы [ 3 ]

1 голос
/ 26 сентября 2019

Вы также можете определить location.code как первичный ключ таблицы (или объявить его как уникальный).Затем вы можете просто агрегировать по этому столбцу и выбрать все остальные столбцы:

SELECT l.*, SUM(p.amount)
FROM locations l LEFT JOIN
     payments p 
     ON p.location_code = l.code
GROUP BY l.code;

Здесь - это дБ <> скрипка.

Это стандарт поведение для SQL;оно основано на так называемой «функциональной зависимости».

0 голосов
/ 26 сентября 2019

Возможно поместить SUM() в коррелированный подзапрос:

demo: db <> fiddle

SELECT
    l.*,
    (SELECT SUM(amount) FROM payments p WHERE p.location_code = l.code)
FROM
    locations l
0 голосов
/ 26 сентября 2019

Как насчет этого?

SELECT
    l.code,
    l.location_name,
    SUM(p.amount)
FROM
    locations l
LEFT JOIN payments p 
ON p.location_code = l.code
GROUP by l.code,l.location_name

Если вы не хотите менять группу по, вам, возможно, придется использовать подзапрос:

SELECT
    l.code,
    (select location_name from locations l2 where l.code=l2.code),
    SUM(p.amount)
FROM
    locations l
LEFT JOIN payments p 
ON p.location_code = l.code
GROUP by l.code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...