2017-02-05 1 views
0

나는 이러한 중요성을 가진 제품에 대한 MySQL 테이블을 보유하고 있습니다.MySQL은 날짜 범위에서 매일 활성 레코드를 계산합니다.

-id

는 해당 월의 일을 반복에 내가 좋아하는 것,

가 도착 방출 열을 사용

을 -released -arrived 통해 '2017년 1월 1일'를 말한다 '2017-01-30'및 "활성"인 제품 수를 확인하십시오. 날짜 범위에 대해 매일 루프를 반복하고 날짜 범위에서 매일 '2017-01-01'에 대해 활성 상태 인 제품 수를 확인한다는 의미입니다.

'2017-01-01'과 같이 개별 날짜를 확인하는 데 사용하는 코드는 다음과 같습니다.

SELECT COUNT(id) 
FROM products_booking 
WHERE (released IS NULL OR released >= '2017-01-01') AND (arrived <= '2017-01-01') 

이렇게하면 현재 "활성"제품 수가 반환됩니다.

그러나 지정된 날짜 범위의 매일 "활성"제품 수를 계산할 수있는 보고서의 지정된 날짜 범위에서이 작업을 수행하고 싶습니다.

나는 다음과 같은 시도를 해본 적이 없으며이 방법으로 잘못된 길을 찾은 것처럼 보입니다.

SELECT MonthDate.Date, COALESCE(COUNT(IB.id), 0) AS Total 
FROM (
    SELECT 1 AS Date UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 3 UNION ALL 
    SELECT 4 UNION ALL 
    SELECT 5 UNION ALL 
    SELECT 6 UNION ALL 
    SELECT 7 UNION ALL 
    SELECT 8 UNION ALL 
    SELECT 9 UNION ALL 
    SELECT 10 UNION ALL 
    SELECT 11 UNION ALL 
    SELECT 12 UNION ALL 
    SELECT 13 UNION ALL 
    SELECT 14 UNION ALL 
    SELECT 15 UNION ALL 
    SELECT 16 UNION ALL 
    SELECT 17 UNION ALL 
    SELECT 18 UNION ALL 
    SELECT 19 UNION ALL 
    SELECT 20 UNION ALL 
    SELECT 21 UNION ALL 
    SELECT 22 UNION ALL 
    SELECT 23 UNION ALL 
    SELECT 24 UNION ALL 
    SELECT 25 UNION ALL 
    SELECT 26 UNION ALL 
    SELECT 27 UNION ALL 
    SELECT 28 UNION ALL 
    SELECT 29 UNION ALL 
    SELECT 30 UNION ALL 
    SELECT 31) AS MonthDate 
LEFT JOIN products AS IB 
ON MonthDate.Date >= DAY(IB.released) AND MonthDate.Date <= DAY(IB.arrived) 
WHERE MonthDate.Date <= DAY(LAST_DAY('2017-01-30')) 
GROUP BY MonthDate.Date 

나는 이것을 시도했지만 매일 1을 반환하고있다.

SELECT COUNT(*) cnt, MonthDate.Date 
FROM (
    SELECT 1 AS Date UNION ALL 
    SELECT 2 UNION ALL 
    SELECT 3 UNION ALL 
    SELECT 4 UNION ALL 
    SELECT 5 UNION ALL 
    SELECT 6 UNION ALL 
    SELECT 7 UNION ALL 
    SELECT 8 UNION ALL 
    SELECT 9 UNION ALL 
    SELECT 10 UNION ALL 
    SELECT 11 UNION ALL 
    SELECT 12 UNION ALL 
    SELECT 13 UNION ALL 
    SELECT 14 UNION ALL 
    SELECT 15 UNION ALL 
    SELECT 16 UNION ALL 
    SELECT 17 UNION ALL 
    SELECT 18 UNION ALL 
    SELECT 19 UNION ALL 
    SELECT 20 UNION ALL 
    SELECT 21 UNION ALL 
    SELECT 22 UNION ALL 
    SELECT 23 UNION ALL 
    SELECT 24 UNION ALL 
    SELECT 25 UNION ALL 
    SELECT 26 UNION ALL 
    SELECT 27 UNION ALL 
    SELECT 28 UNION ALL 
    SELECT 29 UNION ALL 
    SELECT 30 UNION ALL 
    SELECT 31) AS MonthDate 
LEFT OUTER JOIN products IB 
ON (MonthDate.date BETWEEN IB.arrived AND IB.released) 
GROUP BY MonthDate.Date; 
그러나 날짜 열은 필요 I는 다음과 같이 총 활성제의 개수 인 상태, 출력을보고 희망

아니다.

일 총

2017년 1월 1일 3024

2017년 1월 2일 3029

....

2017년 1월 30일 2987

기타를 제안?

+0

예상 결과를 표시 할 수 있습니까? –

+0

예상되는 출력을 편집에 추가했습니다. 잘하면 도움이됩니다. – Ethan

+0

다른 한 가지 질문 : 현재 출력은 무엇입니까? 귀하의 질문은 나에게 괜찮아 보입니다. –

답변

1

날짜 범위 생성에 대한 정보는 this question을 참조하십시오. 동일한 접근 방식이 당신을 위해 작동해야합니다. 지금은 테스트 할 수 없지만 다음과 같이 보일 수 있습니다.

SET @date_min = '2017-01-01'; 
SET @date_max = '2017-01-31'; 

SELECT 
    dg.date, 
    COUNT(pb.id) as daily_count 
from (
    select DATE_ADD(@date_min, INTERVAL (@i:[email protected]+1)-1 DAY) as `date` 
    from information_schema.columns,(SELECT @i:=0) gen_sub 
    where DATE_ADD(@date_min,INTERVAL @i DAY) BETWEEN @date_min AND @date_max 
) date_generator dg 
left join products_booking pb on (pb.released IS NULL OR pb.released >= dg.date) AND (pb.arrived <= dg.date) 
GROUP BY dg.date 
ORDER BY dg.date 
; 
+0

이것은 정확히 필요한대로 작동합니다. 고맙습니다! – Ethan

관련 문제