2012-11-16 9 views
0

안녕하세요. mysql을 쿼리하고 json 인코딩 및 그래프로 데이터 목록을 검색하는 약간의 문제가 있습니다 (예 : 금액 대 날짜 축). 그러나 SQL 올바르게 데이터가없는 쿼리 데이터의 날짜를 반환하지 않습니다. 그래서 그래프에는 날짜가 없습니다.값으로 다차원 배열 합치기

나는 여기에서 어떤 사람들은 공백을 채우는 데에만 다른 테이블을 만드는 작업을 교묘히 읽었다. 이것은 나를위한 선택 사항이 아닙니다.

쿼리에 모든 날짜의 배열을 만드는 솔루션이 있습니다.

다른 사람이 내 다차원 쿼리 결과 배열을 압축 할 수있는 방법을 제안 할 수 있습니까? 잘하면 영리한 foreach의 수단으로.

또는 공백 날짜를 채울 수 있는지 확실하지 않은 SQL 함수가 있습니까?

SELECT SQL_CALC_FOUND_ROWS Date, SUM(call_answer) AS call_answer, SUM(call_busy) AS call_busy, SUM(call_noanswer) AS call_noanswer, SUM(call_notrec) as call_notrec 
    FROM ( 
     SELECT * FROM ( 
      SELECT substring(dateCreated, 1,10) AS Date, COUNT(id) as call_answer, 0 as call_busy, 0 as call_noanswer, 0 as call_notrec 
      FROM cdr 
      WHERE (company = '8346767432431') AND (dateCreated >= '2012-10-16') AND (dateCreated <= '2012-11-16') AND dialStatus = 'NORMAL_CLEARING' GROUP BY Date) 
      AS t_0 
      UNION 
      SELECT * FROM ( 
      SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, COUNT(id) as call_busy, 0 as call_noanswer, 0 as call_notrec 
      FROM cdr 
      WHERE (company = '8346767432431') AND (dateCreated >= '2012-10-16') AND (dateCreated <= '2012-11-16') AND dialStatus = 'USER_BUSY' GROUP BY Date) 
      AS t_1 
      UNION 
      SELECT * FROM ( 
      SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, 0 as call_busy, COUNT(id) as call_noanswer, 0 as call_notrec 
      FROM cdr 
      WHERE (company = '8346767432431') AND (dateCreated >= '2012-10-16') AND (dateCreated <= '2012-11-16') AND (dialStatus = 'ORIGINATOR_CANCEL' OR dialStatus = 'NO_USER_RESPONSE') GROUP BY Date) 
      AS t_2 
      UNION 
      SELECT * FROM ( 
      SELECT substring(dateCreated, 1,10) AS Date, 0 as call_answer, 0 as call_busy, 0 as call_noanswer, COUNT(id) as call_notrec 
      FROM cdr 
      WHERE (company = '8346767432431') AND (dateCreated >= '2012-10-16') AND (dateCreated <= '2012-11-16') AND (dialStatus = 'UNALLOCATED_NUMBER' OR dialStatus = 'INVALID_NUMBER_FORMAT') GROUP BY Date) 
      AS t_3 

    ) 

    AS t_total 
    GROUP BY Date; 

그래서 이미 상당히 지저분 : 같은

내 쿼리는 현재 보인다.

답변

0

MySQL에서 비교 한 결과가 숫자라는 사실을 사용하여 SQL 쿼리를 단순화 할 수 있습니다. false는 0, true는 1입니다. 따라서 계산을 비교하기 위해 합계를 계산할 수 있습니다. 당신의 범위의 끝이 쿼리와 원래 하나에 모두 묵시적으로 시간 0:00 가정 것이다

SELECT DATE(dateCreated) AS `Date`, 
SUM(dialStatus = 'NORMAL_CLEARING') AS call_answer, 
SUM(dialStatus = 'USER_BUSY') AS call_busy, 
SUM(dialStatus = 'ORIGINATOR_CANCEL') AS call_noanswer, 
SUM(dialStatus = 'UNALLOCATED_NUMBER') AS call_notrec 
FROM cdr 
WHERE company = '8346767432431' 
    AND dateCreated BETWEEN '2012-10-16' AND '2012-11-16' -- = 11-16 0:00 ! 
GROUP BY DATE(dateCreated) ASC 

참고. 따라서 첫 번째 초를 제외하고는 그 날을 포함시키지 않을 것입니다. 당신은 그것을 조정해야 할 수도 있습니다.

사물을 결합하는 방법에 대한 실제 질문 : 위 쿼리는 오름차순으로 날짜를 생성합니다. 따라서 날짜 목록을 가져 와서 그 목록의 첫 번째 항목이 다음 레코드의 날짜와 같은지 확인하십시오. 그렇지 않은 경우 결과 데이터에 0의 행을 삽입하고 쿼리의 현재 레코드를 그대로 유지하면서 목록의 다음 날짜부터 계속하십시오.