2017-10-12 3 views
1

는이 같은 테이블이 있습니다.어떻게 주 주문 상태를 매일 계산합니까?</li> </ul> <p></li> <li>DATE_ADD</p> <ul> <li>id_order_state 나는 매일 내가 <code>id_order_state</code><strong>4</strong> 17</strong><strong>을 얼마나 많은 시간 추세 할 :

나는이 같은 노력하지만 내가 원하는 방식으로 작동하지 :

SELECT `id_order_state` , `date_add` , COUNT(`id_order_state`) 
FROM `ps_order_history` 
WHERE `id_order_state` IN(4,17) 
AND `date_add` LIKE '2017%' 
GROUP BY `date_add` 
ORDER BY `date_add` ASC 
LIMIT 0 , 30 

이 지금은이 같은 결과를 얻을 :

4 2017-10-12 11:51:56  1 
4 2017-10-12 10:42:32  1 
4 2017-10-12 10:41:29  1 
4 2017-10-11 17:06:52  1 
4 2017-10-11 17:06:47  1 
4 2017-10-11 17:06:44  1 
4 2017-10-11 17:06:40  1 
4 2017-10-11 17:06:31  1 
17 2017-10-11 17:06:28  1 
17 2017-10-11 17:06:27  1 
4 2017-10-11 17:06:26  2 
17 2017-10-11 17:06:24  2 
17 2017-10-11 17:06:23  1 
4 2017-10-11 17:06:21  2 

을하지만 난이 원하는을 같은 :

예를 들어 : 5 id_order_state 4 및 3 id_order_state 17 on 2017-10-11

결과 :

2017-10-11 8 

나에게 도움이 될만한 사람이 있습니까?

추가 : "타임 스탬프를"변환

+0

샘플 데이터는 며칠이지만 예상되는 결과에는 하루 만 포함됩니다. 어째서? – jarlh

답변

2

시도 날짜() 함수 (쿼리 당) 지난 30 일에 결과를 제한하는 "일"에 :

SELECT 
    date(`date_add`) as date_add, 
    COUNT(*)   as nb, 
FROM 
    `ps_order_history` 
WHERE 
    `id_order_state` IN(4,17) 
AND YEAR(`date_add`) = '2017' 
AND date(`date_add`) >= DATE_SUB(NOW(), INTERVAL 30 DAY) 
GROUP BY 
    date(`date_add`) 
ORDER BY 
    date(`date_add`) ASC 

결과 :

date_add  nb 
2017-10-11 11 
2017-10-12 2 
+0

완벽하게 작동하는 위대하고 큰 감사 =) –

+0

결과를 DESC로 변경하는 방법에 대한 아이디어가 있습니까? 지난 30 일 동안 대신에? –

+0

제한을 사용하는 대신 WHERE 절에서 지난 30 일을 필터링하십시오. – combinatorist

0

나는 CTE (Common Table Expression)를 사용하여 날짜, 요일 및 연도를 그룹화하여 결합했지만 일관된 날짜로 표시합니다 (dd/mm/yyyy와 같이). Getdate()와 함께이 작업을 수행하면 오늘 이전의 데이터를 보유하고있는 테이블에서 TODAY 'S 행만 선택할 수 있습니다. 나는 그것을 마지막에 넣었으므로/*와 * /를 삭제할 수있다. 원한다면 저장 프로 시저를 생성하고 프로 시저 (EXEC PROC sp_today)를 실행할 수 있습니다.

--CREATE PROC sp_today 
--AS 

WITH CTE (a,b,c,d) 
AS 
(
SELECT 
COUNT(id_order_state), 
CONVERT(VARCHAR,DATEPART(DD,date_add)), 
CONVERT(VARCHAR,DATEPART(MM,date_add)), 
CONVERT(VARCHAR,DATEPART(YYYY,date_add)) 
FROM ps_order_history 
WHERE id_order_state = 4 OR id_order_state = 17 
GROUP BY DATEPART(DD,date_add),DATEPART(MM,date_add),DATEPART(YYYY,date_add) 
) 
SELECT b+'/'+c+'/'+d AS [date],a AS [nmbr] FROM CTE 

/* WHERE b = DATEPART(DD,GETDATE()) AND c = DATEPART(MM,GETDATE()) AND d = 
    DATEPART(YYYY,GETDATE())*/