Есть ли способ заменить GROUP BY - PullRequest
3 голосов
/ 10 марта 2020

У меня есть две таблицы, с которыми я работаю: comporder (количество, треска (Fk on cod (product), cod_ship); product (cod (Pk), price); мне нужно создать запрос, который даст мне сумма цен на продукты, которые находятся в таблице comporder для каждого cod_ship; я пришел с этим запросом:

SELECT sum(p.price),c.cod_ship
FROM product as p JOIN comporder as c
ON(p.cod=c.cod)
GROUP BY c.cod_ship;

Однако мне не разрешено использовать функцию GROUP BY, и я не могу показаться чтобы цена была выше, чем количество 1. Например, если в моей таблице соответствия у меня есть:

  quantity     cod     cod_ship   
     2     "1234567890"   27       
     3     "1234567890"   28       
     2     "7894561230"   28       
     1     "5678324515"   28       
     4     "1234567890"   27       
     1     "1234567890"   27    

И если в моей таблице продуктов у меня есть:

     cod          price
 "1234567890"     20.00
 "7894561230"     19.99 
 "5678324515"     25.99

Если я Примените мой запрос, результат будет:

 sum     cod_ship
 60        27
 65.979    28

Когда фактический результат должен быть, в зависимости от количества продуктов в компоновщике таблицы:

sum    // cod_ship//
140      // 27//
125,97    //28//

Так что я не могу похоже, выясняют, как получить сумму также на основе количества продукта и без функции GROUP BY, я должен просто показать сумму как «выходные данные», может кто-нибудь помочь мне понять, как я могу это сделать?

ОТВЕТ НА КОММЕНТАРИИ: Я не могу использовать группу по назначению Мент. Я использую PostgreSQL 12,1

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

По просьбе ФП в комментариях приведено решение с использованием GROUP BY:

SELECT SUM(price * quantity) as sum, cod_ship FROM comporders
INNER JOIN products ON products.cod = comporders.cod
GROUP BY cod_ship;

Редактировать:

Вот решение без использования GROUP BY:

SELECT DISTINCT 
  (
    SELECT SUM(price * quantity)
       FROM products
    INNER JOIN comporders ON products.cod = comporders.cod
    WHERE cod_ship = results.cod_ship
  ) AS sum,
  cod_ship
FROM comporders AS results;

Он работает, сначала выбирая уникальный список cod_ship идентификаторов (по которому мы ранее группировали запрос). Затем мы выполняем подзапрос, используя идентификатор cod_ship, чтобы вычислить сумму для каждого столбца. Мы используем псевдоним таблицы results для ссылки на значения в родительском запросе подзапроса.

SQL Fiddle Link

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

Вы можете выполнить агрегирование в подвыборах так:

SELECT (
    SELECT SUM(p.price) 
    FROM product AS p 
    WHERE p.cod = c.cod
) AS price, c.cod_ship
FROM comporder AS c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...