2013-04-15 3 views
0

제목 혼동? :)SQL이 두 테이블의 조인을 세 번째 조인 된 데이터로 그룹화

장바구니 데이터베이스에서 유용한 보고서를 생성하려고합니다.

가 "date_ordered"포함하는 테이블 orders (및 기타 물건의 무리 나는 걱정하지 않는다), 키 "orders_id"

두 번째 테이블, orders_products의 동일한 "orders_id"키가 주문한 물건에 대한 정보를 가지고 있습니다. 특히, "products_id", "products_quantity"및 "final_price"에 관심이 있습니다.

원하는 것은 수량 * 가격의 합계를 표시하고 date_ordered가 사이에있을 때 products_id별로 그룹화 된 판매 보고서를 생성하는 것입니다. 두 날짜. 그리고 이것으로 할 수 있습니다 :

SELECT op.products_id AS 'PID', 
    SUM(op.products_quantity) AS 'sales Q', 
    SUM(op.final_price * op.products_quantity) AS 'sales $' 
FROM orders o 
JOIN orders_products op 
ON o.orders_id = op.orders_id 
WHERE o.date_purchased 
BETWEEN '2012-01-01' AND '2012-12-31' 
GROUP BY op.products_id 

정상적으로 작동하는 것 같습니다. 그러나 지금은 단순히 제품 이름을 보여주는 다른 열을 보고서에 추가하려고합니다. 이 데이터는 "products_name"열의 products_description 테이블에 있습니다. 그래서 나는이 시도 :

SELECT pd.products_name AS 'Product', 
    op.products_id AS 'PID', 
    SUM(op.products_quantity) AS 'sales Q', 
    SUM(op.final_price * op.products_quantity) AS 'sales $' 
FROM orders o 
JOIN orders_products op 
ON o.orders_id = op.orders_id 
JOIN products_description pd 
ON op.products_id = pd.products_id 
WHERE o.date_purchased 
BETWEEN '2012-01-01' and '2012-12-31' 
GROUP BY op.products_id 

을 그리고 나는 모든 판매 Q를 발견하고 판매 수치가해야 배 무엇인가 $까지 처음에는이 일을 나타났다.

파악 능력을 넘어 이동했습니다 :) 감사합니다.

+0

그룹 조항 –

+0

에 pd.products_name을 추가하십시오. 제품 ID에 3을 곱한 경우 products_description 테이블에 동일한 제품 ID에 대해 3 행이 포함되어 있기 때문입니다. – Walid

+0

@Nikita ... 이상하게도 서버가 다운됩니다! 롤. 재부팅을 시도하고 다시 해보니 똑같은 ... 얼어 버렸어. WEIRD – bcsteeve

답변

1

또 다른 점은 ... group by 절에 제품 이름을 추가하는 것에 대해 다른 사람들이 언급했듯이, 여전히 일종의 직교 좌표 결과가있는 것처럼 보입니다. 실제 데이터를 모른 채, 당신은 내부 쿼리가 바로 PID의 모든 롤업 결과처럼

select 
     pd.products_name AS 'Product', 
     PreQuery.* 
    from 
     (SELECT 
       op.products_id AS 'PID', 
       SUM(op.products_quantity) AS 'sales Q', 
       SUM(op.final_price * op.products_quantity) AS 'sales $' 
      FROM 
       orders o 
       JOIN orders_products op 
        ON o.orders_id = op.orders_id 
      WHERE 
       o.date_purchased BETWEEN '2012-01-01' and '2012-12-31' 
      GROUP BY 
       op.products_id) PreQuery 
     JOIN products_description pd 
     ON PreQuery.PID = pd.products_id 

이 작동합니다 ... 같은 것을 쿼리를 마무리 할 수 ​​있습니다. 그런 다음 결과를 가져 와서 제품 설명 테이블에 결합하십시오.

각 항목에 대해 중복 된 항목이있는 경우 제품 설명 테이블에 동일한 제품 ID에 대한 여러 레코드가있는 것처럼 보입니다 (상위 고유 키가 있지만 여러 상태가있는 동일한 제품이있을 수 있음). , 유형, 문제의 원인을 알려줍니다.

+0

PreQuery ... 저에게 완전히 새로운 개념을 보여 주셔서 감사합니다. 위에서 언급했듯이 여러분은 옳았고 products_description에는 세 개의 항목이있었습니다. 그래서 나는 그것을 보지 않고 당신의 시간을 낭비하는 것에 대해 나 자신에게 짜증이났다. 그러나 나는 일을하는 새로운 방법을보아야하기 때문에 기쁩니다! 감사. – bcsteeve

관련 문제