У меня есть сложный код SQL, который мне нужно изменить, чтобы он собирал информацию о заказе на основе order_ID. В настоящее время отдельные продукты имеют количество, перечисленные в товарных товарах (т. Е. Заказы имеют несколько продуктов, несколько идентификаторов order_ID).Использование GROUP BY для группировки информации о заказе (количество, order_total и т. Д.) На основе order_ID
Вот моя попытка. Все, что я сделал, это добавить SUM() в order_quantity, product_cost, order_total и скидку. Затем я добавил GROUP BY o1.id. Я получил сообщение ERROR, в котором говорилось, что GROUP BY не используется должным образом. Я знаю, что с этим кодом много помех, я просто не хочу удалять все, что необходимо, поскольку я сам не писал этот код.
ВОТ КОД Я пытал:
DROP TABLE IF EXISTS reporting.promo_report;
CREATE TABLE reporting.promo_report
SELECT
v1.id AS variant_id
, v1.cost_price
, p1.name AS product
, GROUP_CONCAT(DISTINCT t1.parent_category SEPARATOR ", ") AS parent_categories
, GROUP_CONCAT(DISTINCT t1.category SEPARATOR ", ") AS sub_categories
FROM `shop`.spree_variants AS v1
INNER JOIN `shop`.spree_products AS p1 ON v1.product_id = p1.id
INNER JOIN `shop`.spree_products_taxons AS t2 ON p1.id = t2.product_id
INNER JOIN (SELECT
t3.id
, t3.name AS category
, COALESCE(t4.name, t3.name) AS parent_category
FROM shop.spree_taxons AS t3
LEFT JOIN shop.spree_taxons AS t4 ON t3.parent_id = t4.id AND t3.parent_id IS NOT NULL) AS t1 ON t2.taxon_id = t1.id
WHERE t1.parent_category NOT IN('City','Themes')
GROUP BY
v1.id;
CREATE INDEX i1 ON reporting.tmp_shop_promo_report(variant_id);
SELECT o1.id AS order_id
, o1.number
, CAST(o1.completed_at AS DATE) AS order_date
, SUM(l1.quantity) as order_quantity
, SUM(l1.price * l1.quantity) AS product_total
, SUM(adjust.amount) as discount
, SUM(l1.cost_price) * l1.quantity AS product_cost
, a2.`code` AS promotion_code
FROM shop.spree_adjustments AS a1
INNER JOIN shop.spree_promotion_actions AS p1
ON a1.`originator_id` = p1.id
AND a1.`originator_type` = 'Spree::PromotionAction'
INNER JOIN shop.spree_activators AS a2
ON p1.`activator_id` = a2.id
INNER JOIN shop.spree_orders AS o1
ON a1.`source_id` = o1.id
AND a1.`source_type` = 'Spree::Order'
INNER JOIN shop.spree_addresses AS a3
ON o1.bill_address_id = a3.id
INNER JOIN shop.spree_states AS s1
ON a3.state_id = s1.id
INNER JOIN shop.spree_line_items AS l1
ON o1.id = l1.order_id
LEFT JOIN reporting.tmp_shop_promo_report AS t1
ON l1.variant_id = t1.variant_id
INNER JOIN shop.line_item_histories AS l2
ON l1.id = l2.line_item_id
LEFT JOIN shop.spree_adjustments as adjust
ON adjust.adjustable_id = o1.id
AND adjust.adjustable_type = 'Spree::Order'
AND adjust.originator_type = 'Spree::PromotionAction'
AND adjust.originator_id <> 2770 #free shipping
WHERE a1.`eligible` = 1
AND a2.code IN('PROMOCODE')
AND NULLIF(a2.code,'') IS NOT NULL
AND o1.completed_at IS NOT NULL;
GROUP BY o1.id
вы пробовали 'GROUP BY order_id'? 'GROUP_BY' может использовать псевдонимы – chiliNUT
thank u для редактирования. Я попробовал order_id. Была возвращена та же ERROR. –
Каждый столбец в элементе должен либо находиться в группе, либо иметь агрегатную функцию. Какую ошибку вы получаете? –