2014-10-10 2 views
0

클릭 수/사용자 수를 내 웹 사이트에 알리려고 쿠키 ID와 날짜가 있습니다. 하지만 난 지금까지 작성한 쿼리에서 내가 얻을 다음과 같은 오류가다중 그룹화 SQL, 클릭 및 사용자 수가 잘못 계산 됨

테이블 카운트가 표시해야

cookieid date  
-------------------- 
001  2011-03-17   
001  2011-03-17   
002  2011-03-17   
001  2011-03-17   
001  2011-03-20 
002  2011-03-21  
114  2011-03-21   
114  2011-03-21  

정확한 방법은 다음과 같습니다

on 2011-03-17 => 4 clicks/2 unique visitors 
on 2011-03-20 => 1 click/1 unique visitor 
on 2011-03-21 => 3 clicks/2 unique visitors 

내가 아래처럼 할 경우 이 올바르게 BU 계산하여 클릭/사용자의 정확한 수를 제공

"INSERT INTO visitos SELECT cookieid,date FROM ",@tab," GROUP BY cookieid" 

쿼리 위의 표에 따르면 날짜를 무시하므로 2011-03-17 => 4 클릭 수/순 방문자 수는 20이되지만 클릭 수/방문수는 20 회로 무시되며 20 번째로 계산되지 않습니다. 쿠키 ID가 다른 방법으로

을 반복하기 때문에

"INSERT INTO visitos SELECT cookieid,date FROM ",@tab," GROUP BY date" 

그것은 모든 날짜를 줄 것이다 클릭/방문하지만, 계산의 결과는, 그것은 2011-03-17 => 4 잘못 말할 것이다있다 쿠키 ID를 무시하고 고유 한 사용자로 모든 클릭을 얻어서/4의 순 방문자를 클릭

사람은 모두 쿠키 ID와 한 번에 날짜

P.S "INSERT INTO visitos SELECT cookieid,date FROM ",@tab," GROUP BY date,cookieid" 
에 의해 그룹이에 SQL 쿼리를 작성하는 나를 도울 수

중 하나

저장된 proceedure

BEGIN 
SET @tab = CONCAT("monitortable_",pr); 
DROP TABLE IF EXISTS uniquevisitors; 
CREATE TEMPORARY TABLE uniquevisitors (`cookieid` INT, `date` DATETIME); 


**SET @sqlstring = CONCAT("(PLACE WHERE GROUPING QUERY SHOULD TAKE PLACE)INSERT INTO uniquevisitors SELECT cookieid,date FROM ",@tab," GROUP BY cookieid");** 


PREPARE stmt FROM @sqlstring; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
DROP TABLE IF EXISTS uniquevisitorscount; 
CREATE TEMPORARY TABLE uniquevisitorscount (`cnt` INT, `dat` DATETIME); 
INSERT INTO uniquevisitorscount SELECT COUNT(cookieid) AS cnt ,DATE(date) AS dat FROM uniquevisitors; 
DROP TABLE IF EXISTS nonuniquevisitcount; 
CREATE TEMPORARY TABLE nonuniquevisitcount (`cnt` INT, `dat` DATETIME); 
SET @sqlstring = CONCAT("INSERT INTO nonuniquevisitcount SELECT COUNT(cookieid) AS cnt ,DATE(date) AS dat 

FROM ",@tab," GROUP BY DATE_FORMAT(date, '%y'),DATE_FORMAT(date, '%m'),DATE_FORMAT(date, '%d')"); 
    PREPARE stmt FROM @sqlstring; 
    EXECUTE stmt; 
    SELECT un.cnt AS ucnt, nu.cnt AS cnt, un.dat AS dat FROM uniquevisitorscount un JOIN nonuniquevisitcount nu ON un.dat = nu.dat; 
END$$ 
+0

당신은 당신의 질문을 다시 태그와 MySQL 또는 SQL-결정할 시겠어요 섬기는 사람? – bummi

+0

그래서 COUNT()와 COUNT (DISTINCT)의 차이점은 무엇입니까? – Strawberry

답변

0

를 작동하지 않았다 시도이

"visitos 날짜 삽입 반 (cookie_id) no_of_clicks를 계산, FROM (별개의 cookie_id) no_of_visitors를 계산" @ 탭, 'GROUP BY 날짜'

0

select x.date, sum(x.cnt) as clicks, count(*) as uniqueVisitors from 
    (select date, cookieid, count(*) as cnt from #temp group by date, cookieid) x 
    group by x.date 

반환이 : 당신은 ... 당신은 그냥에서 삽입 문을 만들 필요가 원하는대로 정확히

date  clicks uniqueVisitors 
2011-03-17 4  2 
2011-03-20 1  1 
2011-03-21 3  2 

...

+0

덕분에 도움이되었습니다 ...하지만 내 질문은 저장 절차 안에 있습니다 ... 나는 당신과 일치하기가 어려웠습니다 ... 저장 절차에 추가하는 것을 도와 줄 수 있습니까? –

+0

나는 당신을 이해하지 못합니다. 스토어드 프로 시저 모두에서 ... 당신의 질문이 MySQL에 관한 것이라는 것을 보았습니다 ... 당신이 ms SQL 서버를 사용하고 있다고 생각했습니다 ... 내 쿼리가 MySQL과 함께 작동하지 않을 것이라고 생각합니다 ... 죄송합니다 – PrfctByDsgn