2015-04-16 3 views
-5

Вопрос: Выберите элемент и цену за каждый элемент в таблице items_ordered. Подсказка: разделите цену на количество.В чем разница между этими двумя SQL-запросами?

1.

select item, sum(price)/sum(quantity) 
from items_ordered 
group by item; 

2.

select item, price/quantity 
from items_ordered 
group by item; 

Посмотрите на resultis для фонариков. Первая показывает правильную цену, а вторая занимает 28/4 и показывает 7, игнорируя 4,5 строки. Кто-то, пожалуйста, объясните, почему это так.

table data с внешнего сайта.

+3

Я предполагаю, что это MySQL? Большинство RDBMS 'поднимут ошибку ... – Ben

+0

Первый возвращает результат, а второй вызывает ошибку. Из того, что я понимаю, вы должны использовать второй, но удалить группу. –

+0

Первый запрос: вы делите сумму цены в _all_ rows на сумму количества в _all_ Rows. Second Query вы делите цену строки _current_ на количество строк _current_. –

ответ

1

SUM() - это групповая функция, поэтому, по существу, говорите, что я получаю всю цену и количество по каждому пункту и добавляю их все, чтобы вернуть их в одну строку.

MySQL довольно прощает при группировке вещей и попытается получить набор строк (вот почему ваш второй пример возвращает что-то - хотя и не так). Как правило, если вы являетесь столбцами GROUPing (элементы в вашем exmaple), вам нужно вернуть одну строку за столбец (элемент).

Попробуйте запустить SQL ниже, чтобы посмотреть, что это будет выглядеть.

SELECT item 
    , SUM(price) AS sum_price 
    , SUM(quantity) AS sum_quantity 
    , COUNT(*) AS item_count 
    , SUM(price)/SUM(quantity) AS avg_price_per_quant 
    FROM items_ordered 
GROUP BY item 
ORDER BY item ASC 
0

Первый запрос возвращает среднюю цену за этот элемент, второй запрос возвращает цену за первый элемент, с которым он сталкивается. Это работает только в MySQL, второй запрос будет ошибкой в ​​SQL Server, поскольку не используется функция aggegrate. См. Это сообщение для получения более подробной информации. Why does MySQL allow "group by" queries WITHOUT aggregate functions?.

Смежные вопросы