2013-03-12 4 views
1

J'essaie d'obtenir des informations de base de données sur les commandes groupées par date. J'ai une table sales_flat_order, où j'ai son identifiant, date de création de la commande, total_payé pour la commande, et le nombre d'articles de la commande. Et j'ai table sales_flat_order_item où sont les articles de commandes avec ses prix.Sélectionner dans select - Chaque table dérivée doit avoir sa propre erreur d'alias

J'ai créé script pour obtenir des informations d'ordre par jour:

SELECT 
    DATE(sales_flat_order.created_at) AS date, 
    SUM(sales_flat_order.total_paid) AS sales, 
    SUM(sales_flat_order.total_item_count) AS items 
FROM 
    sales_flat_order, 
    sales_flat_order_payment 
WHERE 
    sales_flat_order.status = 'complete' 
    AND sales_flat_order.entity_id = sales_flat_order_payment.parent_id 
    AND sales_flat_order_payment.method = 'checkmo' 
GROUP BY DATE(sales_flat_order.created_at) 
WITH ROLLUP 

-je obtenir:

DATE  SALES ITEMS 
2013-03-05 72 3 
2013-03-06 100 5 

Et je script pour compter le prix médian:

SELECT 
    avg(t1.price) as median_val 
FROM 
    (
     SELECT 
      @rownum:[email protected]+1 as `row_number`, 
      d.price 
      FROM 
       sales_flat_order_item d, 
       (SELECT @rownum:=0) r 
      WHERE 1 
      ORDER BY d.price 
    ) as t1, 
    ( 
     SELECT 
      count(*) as total_rows 
     FROM 
      sales_flat_order_item d 
     WHERE 1 
    ) as t2 
WHERE 1 
    AND t1.row_number>=total_rows/2 
    and t1.row_number<=total_rows/2+1; 

Maintenant, je m essayant de combiner ce deux script pour obtenir:

DATE  SALES ITEMS median_item_price 
    2013-03-05 72 3  19 
    2013-03-06 100 5  10.5 

scénario combiné:

SELECT 
    DATE(sales_flat_order.created_at) AS date, 
    SUM(sales_flat_order.total_paid) AS sales, 
    SUM(sales_flat_order.total_item_count) AS items, 
    sales_flat_order_item.price as median_item_price 
FROM 
    sales_flat_order, 
    sales_flat_order_payment, 
    (
     SELECT 
      avg(t1.price) as median_val 
     FROM 
      (
       SELECT 
        @rownum:[email protected]+1 as `row_number`, 
        d.price 
       FROM 
        sales_flat_order_item d, 
        (SELECT @rownum:=0) r 
       WHERE 1 
       ORDER BY d.price 
      ) as t1, 
      (
       SELECT 
        count(*) as total_rows 
       FROM 
        sales_flat_order_item d 
       WHERE 1 
      ) as t2 
     WHERE 1 
      AND t1.row_number>=total_rows/2 
      and t1.row_number<=total_rows/2+1 
    ) as sales_flat_order_item 
WHERE 
    sales_flat_order.status = 'complete' 
    AND sales_flat_order.entity_id = sales_flat_order_payment.parent_id 
    AND sales_flat_order_payment.method = 'checkmo' 
    AND DATE(sales_flat_order_item.created_at) = DATE(sales_flat_order.created_at) 
GROUP BY DATE(sales_flat_order.created_at) 
WITH ROLLUP 

et obtenir l'erreur: # 1248 - Chaque table dérivée doit avoir son propre alias

est la base de données ici: http://sqlfiddle.com/#!2/7dfec

Quelqu'un peut-il aider?

+0

? Quand je joue sur votre violon, je reçois la colonne 'Unknown' sales_flat_order_item.price 'dans' la liste des champs '...'!?! – Strawberry

+0

Yup, toute la requête est incorrecte – Sergio

+0

@ Strawberry, dans sqlfeedle je reçois la même erreur. Si j'écris FROM sales_flat_order, sales_flat_order_payment, sales_flat_order_item erreur disparaissent. Dans phpmyadmin n'était pas une telle erreur. – Alex

Répondre

3

Solution:

SELECT 
    DATE(sales_flat_order.created_at) AS date, 
    SUM(sales_flat_order.total_paid) AS sales, 
    SUM(sales_flat_order.total_item_count) AS items, 
    MAX(median.median_val) as median_item_price 
FROM 
    sales_flat_order, 
    sales_flat_order_payment, 
    (
SELECT DATE(sq.created_at) as median_date, avg(sq.price) as median_val FROM (
SELECT t1.row_number, t1.price, t1.created_at FROM(
SELECT IF(@prev!=d.created_at, @rownum:=1, @rownum:[email protected]+1) as `row_number`, d.price, @prev:=d.created_at AS created_at 
FROM sales_flat_order_item d, (SELECT @rownum:=0, @prev:=NULL) r 
ORDER BY d.price 
) as t1 INNER JOIN 
(
    SELECT count(*) as total_rows, created_at 
    FROM sales_flat_order_item d 
    GROUP BY created_at 
) as t2 
ON t1.created_at = t2.created_at 
WHERE 1=1 
AND t1.row_number>=t2.total_rows/2 and t1.row_number<=t2.total_rows/2+1 
)sq 
group by DATE(sq.created_at) 
    ) as median 
WHERE 
    sales_flat_order.status = 'complete' 
    AND sales_flat_order.entity_id = sales_flat_order_payment.parent_id 
    AND sales_flat_order_payment.method = 'checkmo' 
    AND median.median_date = DATE(sales_flat_order.created_at) 
GROUP BY DATE(sales_flat_order.created_at) 
WITH ROLLUP 
Questions connexes