2014-03-04 2 views
0

비슷한 항목을 검색하려고 시도했지만 지금까지는 행운을 찾지 못했습니다.사용자 정의 값을 사용하는 MySQL GROUP BY

전화기 로그 (ID, 번호, 원본 및 전화 이름)가 포함 된 테이블에서 쿼리가 실행되었습니다. 그 목적은 전화 이름에 다른 criterias별로 그룹화 된 총 통화 수를 가져 오는 것입니다 (4 ~ 5 가지 통화가 있음). 현재이 같은 일을 해요 :

SELECT COUNT(phones_statistics.id) AS number_of_calls, phones_statistics.calldate 
FROM phones_statistics 
INNER JOIN phones ON phones_statistics.phone_id = phones.id 
WHERE phones.abbr NOT LIKE '@%' 
GROUP BY 
    YEAR(phones_statistics.calldate) 
    + '-' 
    + MONTH(phones_statistics.calldate) 
    + '-' 
    + DAY(phones_statistics.calldate) 
; 

문제를, 당신은 아마 이미 볼 수있는 것은, 각 LIKE 기준을 좋아하지/위해, 나는 다른 기준을 가진 다른 쿼리를 작성해야한다는 것입니다, 나는 생각 이것은 곧 불쾌해질 것입니다 (현재 5 개의 쿼리가 있으며 결과를 반환하기 전에 총 20 초 동안 실행됩니다).

그래서 나는이 같은 사용자 정의 그룹 구성하여 트릭을 여러 쿼리를 방지 할 수있는 몇 가지 쉬운 방법이 없다, 궁금 :

SELECT 
    COUNT(phones_statistics.id) AS number_of_calls, 
    phones_statistics.calldate, 
    (something like a switch - 4 statements, 4 return values, 
    assigned to this field) 
    AS custom_field 
... 
rest of the query 
... 
GROUP BY custom_field, 
    YEAR(phones_statistics.calldate) 
    + '-' 
    + MONTH(phones_statistics.calldate) 
    + '-' 
    + DAY(phones_statistics.calldate) 

답변

1

첫째, 당신의 group by 조항의 날짜 부분은하지 않습니다 감각. 나는 당신이 단순히 date(calldate)을 원한다고 가정합니다. 그러나 오늘의 값 (2014-03-04)은 다음과 같습니다.

2014 + '-' + 03 + '-' + 04 

MySQL은 숫자를 추가 할 때 '+'를 사용합니다. 숫자를 나타내는 숫자를 기반으로 문자열을 자동으로 숫자로 변환합니다. 값이없는 경우 0입니다. MySQL에서는 표현식이 다음과 같이 추가됩니다 : 2021. 나에게 이것은 이상한 일처럼 보입니다. , 즉

SELECT date(ps.calldate) as calldate, 
     SUM(ps.abbr NOT LIKE 'patten1%') as numPattern1, 
     SUM(ps.abbr NOT LIKE 'patten2%') as numPattern2, 
     SUM(ps.abbr NOT LIKE 'patten3%') as numPattern3, 
     SUM(ps.abbr NOT LIKE 'patten4%') as numPattern4, 
     SUM(ps.abbr NOT LIKE 'patten5%') as numPattern5 
FROM phones_statistics ps INNER JOIN 
    phones p 
    ON ps.phone_id = p.id 
WHERE ps.abbr NOT LIKE '@%' 
GROUP BY date(calldate); 

조건 집계를 사용하여 별도의 열에서 각 값을 넣어 :

난 당신이 뭔가를 할 생각한다.

+0

감사를 사용하여이 작업을 수행 할 수있는 또 다른 방법을 찾았습니다. 나는 원래 년과 월을 택했고 나중에 날짜를 추가했다. (어제는'DATE' 함수를 기억하기에는 너무 졸 았던 것 같다.) 그러나 여전히 날짜가 문자열이 아니라 숫자로 주어졌다. 게다가 그것은 정확하게 작동해야하며 깔끔한 방법입니다. 고맙습니다 :) – NorthBridge

0

그냥 기록을 위해, 나는 코드에 대한 CASE...WHEN

SELECT 
    COUNT(phones_statistics.id) AS calls_number, 
    DATE(phones_statistics.calldate), 
    CASE 
    WHEN phones.abbr LIKE '%pattern1%' THEN 'Result1' 
    WHEN phones.abbr LIKE '%pattern2%' THEN 'Result2' 
    ELSE 'default_result' 
    END 
as type 
FROM phones_statistics 
INNER JOIN phones ON phones_statistics.phone_id = phones.id 
GROUP BY type, DATE(phones_statistics.calldate);