2014-11-06 3 views
0

매월 총 판매로 보고서를 만들어야합니다. 매출이없는 달에 대해서는 0으로 설정해야합니다. 이것은 내가 지금까지 작업하고있는 쿼리이며, 모든 조합을 아무런 노력없이 시도한 것처럼 느낍니다. 내 보고서 목적을 위해 다른 배열에 매월 1 배열 및 판매 개월이 필요합니다.Mysql은 비어있는 달이있는 달 단위로 판매 테이블에 왼쪽으로 가입

쿼리

$productSql = "SELECT months.monthnum, SUM(orders.total) FROM months LEFT JOIN orders ON months.monthnum = MONTH(orders.closeddate) WHERE orders.status = 'Closed' GROUP BY MONTH(orders.closeddate) ORDER BY months.monthnum ASC"; 
$productResult = mysql_query($productSql, $link); 

while($productRow = mysql_fetch_array($productResult)){ 

$label[] = $productRow['months.monthnum']; 
$data[] = $productRow['SUM(orders.total)']; 
}; 

echo "[".json_encode($label).",".json_encode($data)."]"; 

결과 :

[[null,null],["6000.00","3100.00"]] 

가 어떻게 그것이 첫 번째 배열의 모든 달을 보여 얻고, 제로의 두 번째 배열에없는 판매와 개월 수 있습니까? 나는 GROUP BY가 나를 죽이고 있다고 생각하지만, 나는 판매를 합산하기 위해 그것을 필요로한다. 도움!

추신 : 나는이 프로젝트가 끝나자 마자 내가 mysql을 사용을 중단해야한다는 것을 알고있다. 감사!

EDIT

위해서 var_dump 결과 :

array(1) { [0]=> NULL } array(1) { [0]=> string(7) "6000.00" } array(2) { [0]=> NULL [1]=> NULL } array(2) { [0]=> string(7) "6000.00" [1]=> string(7) "3100.00" } 

EDIT 2

정도로 문제는 WHERE 절이다. 나는 닫힌 주문 만 원하기 때문에 where 절이 필요하다. WHERE 절을 제거하면 월이 0이고 영업이없고 개월이 올바르게 계산됩니다. 그러나 그것은 단지 모든 명령을 포함하고 있습니다. WHERE 절을 어디에 두어 모든 달을 계속 유지할 수 있습니까?

+0

db에 이미 모든 달이 있습니까? 필자가 월 테이블이 필요하지 않은 경우 12 개의 정수가 필요합니다. – Mihai

+0

모든 팁 왜 monthnum 열의 null 값을 반환하는 이유는 무엇입니까? 이미 관련 월을 모두 포함하는 테이블을 가지고 있지 않으면 다시 – sergio0983

+0

에 참여할 수 없습니다. SQL은 이와 같은 허공에서 레코드를 생성 할 수 없습니다. 어딘가에서 "행진"을하지 않으면 출력에서 ​​"행진"을 얻지 못할 것입니다. 특정 DB가 레코드 시퀀스 (예 : 순차적 날짜)를 생성하도록하는 비표준 확장이 있지만 표준이 아니므로 이식 할 수 없습니다. –

답변

3

다음과 같은 쿼리를 사용하여 0 값을 얻을 수 있습니다 :

  • o.status에 대한 비교가 on 절로 이동 : 세 가지 중요한 변화가 있습니다

    SELECT m.monthnum, coalesce(SUM(o.total), 0) 
    FROM months m LEFT JOIN 
        orders o 
        ON m.monthnum = MONTH(o.closeddate) AND o.status = 'Closed' 
    GROUP BY m.monthnum 
    ORDER BY m.monthnum ASC"; 
    

    .

  • 집계는 orders 테이블이 아닌 months 테이블을 사용합니다.
  • NULL 대신 0을 얻기 위해 총 사용량은 coalesce()입니다.

또한 테이블 별칭을 도입하여 쿼리 작성 및 읽기가 더 쉬워졌습니다.

+0

이것은 두 배열 모두에 대해 null을 반환했습니다. (주문 테이블을 개월 테이블에 조인 할 경우 모든 월이 표시되지 않는 이유를 알지 못합니다. –