2013-09-08 3 views
2

날짜 테이블을 사용하여 주별로 여러 열을 계산하려고합니다. 하나의 열로 처리 할 수 ​​있으며 정상적으로 작동합니다. 그러나 여러 열을 계산할 때 결과가 잘못되거나 중복됩니다. 나는 그것이 합류 때문이라고 생각한다. 예상대로데이터 테이블을 기반으로 여러 열 계산 - MySQL

이 하나 개의 컬럼에 대해 작동합니다

SELECT 
DATE_FORMAT(thedate, '%u') as week 
,COUNT(t.completed_date) as completed 

FROM datetable 
LEFT JOIN projects t ON t.completed_date = thedate 
WHERE thedate BETWEEN YEAR(NOW()) AND NOW() 
GROUP BY YEARWEEK(thedate,7) 

선택에 ,COUNT(t.sales_date) as sales을 추가함으로써, 나는 완료 및 판매에 대한 중복 카운트를 얻을 것이다.

이 샘플에 기반

(프로젝트)

| id | completed_date | sales_date | 
| 1 | NULL   | NULL  | 
| 2 | NULL   | 2013-08-26 | 
| 3 | NULL   | 2013-08-28 | 
| 4 | 2013-09-06  | NULL  | 

내가 영으로 모든 날짜가 필요하기 때문에 전혀있을 때 나는 datetable를 사용하지 않는거야

| week | completed | sales | 
| 34 | 0   | 0  | 
| 35 | 0   | 2  | 
| 36 | 1   | 0  | 

을 찾고 있어요 날짜. 하위 쿼리로 해결할 수 있다고 생각하지만이 쿼리에는 12 개의 다른 날짜 필드도 포함되어야합니다 (샘플 제외).

많은 서브 쿼리를 사용하는 것보다이 문제를 해결하는 더 좋은 방법이 있습니까? 내 SQL 조금 녹슬니다.

답변

1

한 가지 방법은 각 값을 일주일별로 그룹화 한 하위 쿼리를 사용하여 모두 병합하는 것입니다.

SELECT d.week, completed, sales 
FROM (SELECT YEARWEEK(thedate) week 
     FROM datetable 
     WHERE thedate BETWEEN YEAR(NOW()) AND NOW() 
     GROUP BY week) d 
LEFT JOIN (SELECT YEARWEEK(completed_date) week, COUNT(*) completed 
      FROM projects 
      WHERE completed_date BETWEEN YEAR(NOW()) AND NOW() 
      GROUP BY week) c 
ON c.week = d.week 
LEFT JOIN (SELECT YEARWEEK(sales_date) week, COUNT(*) sales 
      FROM projects 
      WHERE sales_date BETWEEN YEAR(NOW()) AND NOW() 
      GROUP BY week) s 
ON s.week = d.week 

이 방법을 더 쉽게 추가 열로 확장 :

SELECT DATE_FORMAT(thedate, '%u') AS week, 
     IFNULL(SUM(completed_date = thedate), 0) AS completed, 
     IFNULL(SUM(sales_date = thedate), 0) AS sales 
FROM datetable 
LEFT JOIN projects 
ON thedate IN (completed_date, sales_date) 
WHERE thedate BETWEEN YEAR(NOW()) AND NOW() 
GROUP BY week 
+0

감사합니다,하지만 같은 진술; 12 개의 하위 쿼리를 추가 할 때 더 쉬운 방법이 있어야한다고 생각합니다. – stiq

+0

새 쿼리가 추가 되었습니까? – Barmar

+0

WHERE 절을 추가하더라도 훨씬 더 좋지만 속도가 느립니다. 1 초에 10 개의 행을 반환합니다. 루프를 사용하여 첫 번째 쿼리를 만들고이를 사용할 수도 있습니다. – stiq

관련 문제