2016-08-26 5 views
2

에서 나는 다음과 같이 의해 ROLLUP, 그룹을 왼쪽을 갖는 쿼리를 가입 :은 가입 왼쪽에 기본 값으로 NULL을 교체하지만 ROLLUP

+------------+-------+---------+------+ 
| user_agent | value | recoqty | C | 
+------------+-------+---------+------+ 
| NULL  | NULL | topics | 1330 | 
| abscdef | NULL | topics | 1330 | 
| abscdef | NULL | topics | 1285 | 
| abscdef | 1  | topics | 25 | 
| abscdef | 0  | topics | 20 | 
+------------+-------+---------+------+ 
이 같은 결과를 제공

Select * from 
(
    Select user_agent, 
    value, 
    recoqty, 
    count(recoqty) as C 
    from august_2016_search_stats SS 
    LEFT JOIN august_2016_extra E 
     on (SS.id = E.stats_id and E.key = 'personalized') 
    where time >= '2016-08-22 00:00:00' and 
      time <= '2016-08-22 23:59:59' and 
      query_type = 'myfeed' and 
      recoqty = 'topics' 
    group by recoqty, 
      user_agent, 
      value 
    with ROLLUP 
    having recoqty is not null 
) D 
order by C desc; 

여기에서 값 (NULL 1285)은 LEFT JOIN 때문입니다. 값 (NULL 1330)은 롤업 때문입니다. 그러나 LEFT JOIN에 대해서만 NULL 값을 바꾸고 ROLLUP 대신에 값을 바꿀 수있는 방법이 있습니까?

답변

0

데이터에서 나온 NULL 값이 롤업에서 가져온 NULL 값과 구별되지 않기 때문에 다소 까다 롭습니다. 한 가지 가능한 해결 방법은 값을 'NA' 또는 COALESCE을 사용하여 'NA' 또는 value 열로 바꾼 비 집계 쿼리를 먼저 수행하는 것입니다. 그런 다음 GROUP BY 롤업을 사용하여 하위 쿼리로 집계하십시오. value 열의 NULL 값은 실제 데이터가 아닌 롤업의 값입니다.

SELECT t.user_agent, 
     t.value, 
     t.recoqty, 
     t.C 
FROM 
(
    SELECT user_agent, 
      COALESCE(value, 'NA') AS value 
      recoqty, 
      COUNT(recoqty) AS C 
    FROM august_2016_search_stats SS 
    LEFT JOIN august_2016_extra E 
     ON SS.id = E.stats_id AND 
       E.key = 'personalized' 
    WHERE time >= '2016-08-22 00:00:00' AND 
      time <= '2016-08-22 23:59:59' AND 
      query_type = 'myfeed' AND 
      recoqty = 'topics' 
) t 
GROUP BY t.recoqty, 
     t.user_agent, 
     t.value 
WITH ROLLUP 
HAVING t.recoqty IS NOT NULL 
+0

시도한 COALESCE이지만 결과에는 차이가 없습니다. –

+0

위 쿼리를 실행하면 어떻게됩니까? –

+0

모든 NULL 값이 NA로 대체되었습니다 –