Подзапросы, псевдонимы и сохраненные значения - MySQL - PullRequest
0 голосов
/ 04 апреля 2020

У меня возникла следующая проблема:

Создайте оператор SQL, который показывает все отправленные заказы на общую сумму более 14 000 долларов США. Результаты должны содержать имя клиента, фамилию, идентификатор заказа, дату отправки заказа, количество товаров и общую сумму. Убедитесь, что при расчете общей суммы учитывается любая скидка.

Таблицы, из которых можно извлечь следующие данные: Элементы заказа: количество, list_price, скидка, идентификатор заказа

Заказ: идентификатор_порядка, дата отправления, статус_заказа, customer_id

Клиенты: first_name, last_name, customer_id.

Я довольно новичок в SQL и подзапросах, поэтому я попытался построить его изнутри, и он продолжал давать мне возвращенные строки ... до последнего соединения ("sub2"). Мой код ниже (не элегантный, но мне нужно выяснить проблему, прежде чем беспокоиться об этом).

select c.first_name, c.last_name, sub2.order_id, sub2.shipped_date, sub2.quantity, sub2.total_amount from customers AS c
    INNER JOIN(
            select o.order_id,  o.shipped_date, o.order_status, o.customer_id, sub1.total_price FROM orders as o
                INNER JOIN  (
                            SELECT oi.order_id, SUM((oi.list_price * oi.quantity) - ((oi.list_price * oi.quantity) * (oi.discount))) AS total_price 
                                FROM order_items AS oi
                                group by oi.order_id
                            ) AS sub1
                ON o.order_id = sub1.order_id
                WHERE
                    sub1.total_price > 14000
                            AND
                    o.order_status = 4
                    ) AS sub2
ON c.customer_id = sub2.customer_id
;

Я получаю ошибку «Неизвестный столбец» sub2.quantity «в» списке полей «Я думаю, Mysql не нравится это двойное вложение, так как я могу go решить эту проблему?

1 Ответ

0 голосов
/ 04 апреля 2020

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

Например: ... INNER JOIN(select o.order_id, o.shipped_date, o.order_status, o.customer_id, sub1.total_price FROM ...

не имеет quantity приведенного значения, поэтому, когда его строки вызываются как sub2, существует Unknown column 'sub2.quantity' in field list, по той же причине произойдет сбой и с sub2.total_amount.

Я предполагая, что, поскольку вы группируете по общей сумме заказа, она также должна давать сумму количества товаров. Так что SQL должно быть таким:

select c.first_name, c.last_name, sub2.order_id, sub2.shipped_date, sub2.quantities, sub2.total_amount from customers AS c
    INNER JOIN(
            select o.order_id,  o.shipped_date, o.order_status, o.customer_id, sub1.total_price as total_amount, sub1.total_quantities FROM orders as o
                INNER JOIN  (
                            SELECT oi.order_id,SUM(oi.quantity) as total_quantities, SUM((oi.list_price * oi.quantity) - ((oi.list_price * oi.quantity) * (oi.discount))) AS total_price 
                                FROM order_items AS oi
                                group by oi.order_id
                            ) AS sub1
                ON o.order_id = sub1.order_id
                WHERE
                    sub1.total_price > 14000
                            AND
                    o.order_status = 4
                    ) AS sub2
ON c.customer_id = sub2.customer_id group by sub2.order_id;
...