2013-07-23 3 views
0

열이있는 테이블이 있습니다 : date, category, views.범주 별 SQL 쿼리의 빈도

나는 나에게 다음과 같은 출력을 제공하는 쿼리를 작성하고 싶습니다 : 예를 들어

year, quarter, category, "relative percentage of category views by quarter"

:

2013, Q1, blue, 0.15 
2013, Q1, yellow, 0.05 
2013, Q1, green, 0.80 
2013, Q2, blue, 0.20 
2013, Q2, yellow, 0.05 
2013, Q2, green, 0.75 
2013, Q3, blue, 0.10 
2013, Q3, yellow, 0.15 
2013, Q3, green, 0.65 

참고 각 분기에 대한 상대적인 주파수를 추가 할 것을를 1 세트의 범주에 걸쳐

이것은 단순히 SQL 만 사용하여 동적으로 처리하기에는 너무 많은 상태입니까 (MySQL을 사용하고 있습니까)?

이것은 내가 지금까지 가지고있는 것입니다.

모든 주파수에서 상대 주파수 출력 합계가 1을 제외하고는 거의 원하는 것입니다.

SET @total_views = SELECT sum(views) FROM daily_views_by_category; 

SELECT 
    year(dt), 
    quarter(dt), 
    category, 
    sum(views)/@total_views AS category_views 
FROM 
    daily_views_by_category 
GROUP BY 
    year(dt), quarter(dt), category 
ORDER BY 
    year(dt), quarter(dt), category 
; 

답변

1

변수가 아닌 join으로 지정하려고합니다. 집계 함수를 사용

SELECT yqc.yr, yqc.qt, category, 
     (yqc.views/yq.views) as category_views 
FROM (select year(dt) as yr, quarter(dt) as qt, category, sum(views) as views 
     from daily_views_by_category vbc 
     group by year(dt), quarter(dt), category 
    ) yqc join 
    (select year(dt) as yr, quarter(dt) as qt, sum(views) as views 
     from daily_views_by_category vbc 
     group by year(dt), quarter(dt) 
    ) yq 
    on yqc.yr = yq.yr and yqc.qt = yq.qt 
ORDER BY 1, 2, 3; 
0

케이스 : 아이디어는 연산을 수행하는 올해 분기 카탈로그에 의해 또한 올해 분기 데이터를 요약하고 함께 결과에 가입하는 것입니다. MySQL 8.0.2부터, 엔진은 집계 함수/윈도우 함수를 지원하지만, 나는 그것을 테스트하지 않았다.

SELECT year(dt) 
     ,quarter(dt) 
     ,category 
     ,SUM(views) 
     ,SUM(views)*1.0/SUM(SUM(views)) OVER (PARTITION BY year(dt), quarter(dt)) 
    FROM daily_views_by_category 
GROUP BY 
     year(dt) 
     ,quarter(dt) 
     ,category