2015-02-04 2 views
1

У меня есть сложный код 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 
+0

вы пробовали 'GROUP BY order_id'? 'GROUP_BY' может использовать псевдонимы – chiliNUT

+0

thank u для редактирования. Я попробовал order_id. Была возвращена та же ERROR. –

+0

Каждый столбец в элементе должен либо находиться в группе, либо иметь агрегатную функцию. Какую ошибку вы получаете? –

ответ

0

Вы не говорите, что ваша ошибка, но попробуйте это:

-- as your code 
SELECT o1.id AS order_id 
    , MAX(o1.number) as 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 
    , max(a2.`code`) AS promotion_code 
-- as your code 
Смежные вопросы