Использование условных операторов и переменных MYSQL в запросе - PullRequest
1 голос
/ 16 ноября 2010

Привет, я просто не могу построить MYSQL-запрос Im после.

Скажем, у меня есть результат из двух столбцов: 1) имя браузера и 2) количество браузеров.

Когда все становится сложнее, я хочу, чтобы по достижении 90% общего количества счетчиков все остальные браузеры переименовывались в другие и соответственно отмечали оставшийся процент.

Я знаю, что могу получить общее количество как переменную, прежде чем начать основной оператор:

SELECT @total := COUNT(id) FROM browser_table WHERE start LIKE "2010%";

Затем я могу сгруппировать результаты по браузеру:

SELECT browser, COUNT(id) AS visits
FROM browser_table
WHERE start LIKE "2010%"
GROUP BY browser

Я знаю, что мне нужно добавить оператор case (и переменную counter) для сортировки столбцов, но не уверен, как реализовать в приведенном выше запросе:

CASE 
  WHEN counter >= 0.9* @total THEN 'other'
  ELSE browser
END AS browser;

Надеюсь, что имеет смысл? Спасибо за ваше время ....

1 Ответ

0 голосов
/ 16 ноября 2010

Вот один из подходов ...

Вы можете рассчитать промежуточную сумму на основе этого ответа . Пример:

SET @rt := 0;
SELECT
    browser,
    visits,
    (@rt := @rt + visits) AS running_total
FROM
    (
        SELECT
            browser,
            COUNT(id) AS visits
        FROM
            browser_table
        WHERE
            start LIKE '2010%'
        GROUP BY
            browser
        ORDER BY
            visits DESC
    ) AS sq
;


Как только вы это сделаете, вы можете использовать его для создания категории «Другое»:

SET @threshold := (SELECT COUNT(id) FROM browser_table WHERE start LIKE '2010%') * 0.90;
SET @rt := 0;
SELECT
    browser,
    SUM(visits) AS total_visits
FROM
    (
        SELECT
            IF (@rt < @threshold, browser, 'Other') AS browser,
            visits,
            (@rt := @rt + visits) AS running_total
        FROM
            (
                SELECT
                    browser,
                    COUNT(id) AS visits
                FROM
                    browser_table
                WHERE
                    start LIKE '2010%'
                GROUP BY
                    browser
            ) AS sq1
        ORDER BY
            visits DESC
    ) AS sq2
GROUP BY
    browser
ORDER BY
    total_visits DESC
;
...