2013-03-12 1 views
1

날짜별로 그룹화 된 주문에 대한 데이터베이스 정보를 가져 오려고합니다. sales_flat_order 테이블이 있습니다. id, 주문 생성 날짜, 주문에 대한 total_paid 및 주문 항목 수를 가지고 있습니다. 그리고 나는 sales_flat_order_item이라는 테이블을 가지고 있습니다. select in select - 파생 테이블마다 고유 한 별칭 오류가 있어야합니다.

나는 하루 주문 정보를 얻기 위해 스크립트를 생성 :

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

그리고 중간 가격 계산 스크립트가 :

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 

내가 얻을 지금은 '

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; 

을 이 두 스크립트를 결합하여 다음을 얻으려고합니다.

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

결합 된 스크립트를

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 

얻을 오류 : - : http://sqlfiddle.com/#!2/7dfec

누군가가 도와 드릴까요 # 1248은 모든 파생 테이블은 자신의 별명 여기

데이터베이스입니다

있어야합니다?

+0

? 귀하의 피들에 대한 쿼리를 재생할 때 알 수없는 열 'sales_flat_order_item.price'가 'field list'... '!'!?! – Strawberry

+0

그래, 전체 쿼리가 올바르지 않습니다 – Sergio

+0

@Strawberry, sqlfeedle에서 같은 오류가 발생합니다. FROM sales_flat_order, sales_flat_order_payment를 작성하면 sales_flat_order_item 오류가 사라집니다. phpmyadmin에서 그런 오류가 아니 었습니다. – Alex

답변

3

솔루션 :

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 
관련 문제