Как создать SQL-запрос для возврата avg (цена), min (цена), max (цена) вместе с avg (заказ), min (заказ), max (заказ) - PullRequest
3 голосов
/ 07 декабря 2011

Я хотел бы создать SQL-запрос, который возвращает результаты вместе для 2 разных запросов. Например, я хотел бы получить результаты в виде: Наименование товара, avg (цена), min (цена), max (цена), avg (заказ), min (заказ), max (заказ) На данный момент у меня есть 2 sql запросов вида:

select 
  product.name, order.id, avg(price), min(price), max(price) 
from 
  product, order 
where
  product.name = order.product_name and product.name = 'price' 
group by 
  product.name, order.id

select 
  product.name, order.id, avg(order), min(order), max(order) 
from 
  product, order 
where 
  product.name = order.product_name and product.name = 'order' 
group by 
  product.name, order.id

У некоторых товаров есть цена и порядок, у других - только цена, а у других - только и порядок. Как мне написать запрос, который будет отображать все результаты, и объединить те, у которых есть и заказ, и цену, и отобразить те, у которых есть обе строки?

Ответы [ 2 ]

4 голосов
/ 07 декабря 2011

Я думаю, что вам нужно полное внешнее объединение, так как строки могут быть в одной или другой таблице, или в обеих:

SELECT 
   NVL(t1.name,t2.name) as name,
   NVL(t1.id, t2.id) as id,
   avg_price,
   min_price,
   max_price,
   avg_order,
   min_order,
   max_order
FROM 
(select product.name, order.id, avg(price) as avg_price, min(price) as min_price, max(price) as max_price 
from product, order 
where product.name = order.product_name and product.name = 'price' 
group by product.name, order.id) t1
FULL OUTER JOIN
(select product.name, order.id, avg(order) as avg_order, min(order) as min_order, max(order) as max_order
from product, order 
where product.name = order.product_name and product.name = 'order' 
group by product.name, order.id) t2
ON t1.name = t2.name
0 голосов
/ 07 декабря 2011

Ваши запросы не имеют большого смысла, поэтому я многое попытался сделать из вашего вопроса. Всегда лучше публиковать сценарии create table и некоторые примеры данных (а также желаемый результат), задавая вопросы SQL.

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

CREATE TABLE product(id NUMBER, name VARCHAR2(10));

CREATE TABLE orders(product_name VARCHAR2(10), VALUE NUMBER);

INSERT INTO product
VALUES     (1, 'order');    
INSERT INTO product
VALUES     (1, 'price');    
INSERT INTO product
VALUES     (2, 'order');    
INSERT INTO product
VALUES     (3, 'price');    
INSERT INTO orders
VALUES     ('order', 5);    
INSERT INTO orders
VALUES     ('price', 5);    
COMMIT;

При таком сценарии в следующем запросе будут представлены 3 строки с заполненными в соответствующих случаях столбцами «заказ» и / или «цена».

SELECT   p.id,
         AVG(o1.VALUE) as avg_price,
         MIN(o1.VALUE) as min_price,
         MAX(o1.VALUE) as max_price,
         AVG(o2.VALUE) as avg_order,
         MIN(o2.VALUE) as min_order,
         MAX(o2.VALUE) as max_order
FROM             product p
         LEFT JOIN orders o1
              ON p.name = o1.product_name AND p.name = 'price'
         LEFT JOIN orders o2
              ON p.name = o2.product_name AND p.name = 'order'
GROUP BY p.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...