Как конвертировать результат SQL в процент

0

Я пытаюсь найти процентное увеличение за последние 7 дней, но я немного застрял. В настоящее время в запросе SQL, который я создал, вы можете получить общее количество новых учетных записей за последние 7 дней. Но теперь, как я могу улучшить, чтобы вернуть результат в процентах?

Вот запрос SQL, сделанный до сих пор.

Спасибо

SELECT COUNT(DISTINCT account_type)
FROM account
WHERE date_created > NOW() - INTERVAL 7 DAY
  • 0
    Процент чего? Я не понимаю ваш запрос. Почему вы считаете разные типы и говорите, что это количество учетных записей?
Теги:
database

6 ответов

0

Предполагая, что у вас есть одна строка на одну учетную запись, вам не нужно distinct. Я предполагаю, что вы хотите:

SELECT (SUM(date_created >= CURDATE() - INTERVAL 7 DAY) * 100/ 
        SUM(date_created > CURDATE() - INTERVAL 7 DAY)
       ) as percent_increase
FROM account
0

Вы можете создать временную таблицу с двумя столбцами, например "старый счет" и "новый счет". Заполните таблицу значениями, полученными от запросов SELECT. Затем извлеките значения из таблицы temp, чтобы вычислить процентную разницу и удалить временную таблицу.

0

С целью запуска всего в одном запросе вы можете рассмотреть следующий запрос:

SELECT
  /* Count for previous period. */
  beforeCount,
  /* Count for current period. */
  afterCount,
  /* Simple math, just calculating percentage. */
  (beforeCount * 100) / afterCount AS percent
FROM (
  SELECT
  /* Select count for previous period. */
  (
    SELECT COUNT(DISTINCT account_type)
    FROM account
    WHERE date_created BETWEEN NOW() - INTERVAL 14 DAY AND NOW() - INTERVAL 7 DAY
  ) AS beforeCount,
  /* Select count for current period. */
  (
    SELECT COUNT(DISTINCT account_type)
    FROM account
    WHERE date_created > NOW() - INTERVAL 7 DAY
  ) AS afterCount
) AS tmp
0

Условная агрегация может работать. Используйте CASE чтобы считать только новые и другие, чтобы считать только старые учетные записи.

SELECT count(DISINCT CASE
                       WHEN date_created > NOW() - INTERVAL 7 DAY THEN
                         account_type
                     END)
       /
       count(DISTINCT CASE
                        WHEN date_created <= NOW() - INTERVAL 7 DAY THEN
                          account_type
                      END)
       * 100 increase
       FROM account;
0

С временной таблицей вы можете сделать так:

    create temporary table storeCount IF NOT EXISTS (
        oldCount INT(10) not null,
        newCount INT(10) not null
    );

    insert into percentage (oldCount,newCount) 
    values
    (SELECT COUNT(DISTINCT acc1.account_type)FROM account acc1, SELECT COUNT(DISTINCT acc2.account_type)
        FROM account acc2 WHERE acc2.date_created > NOW() - INTERVAL 7 DAY);

    select ((newCount/oldCount)*100) as percentage from storeCount;

    drop temporary table IF EXISTS storeCount;
0

вы можете попробовать ниже, рассчитать последний счет в 7 дней, а затем рассчитать до 7 дней, а затем рассчитать процент

    select max(last7days_count) as last7days_count,
max(before7days_count) as before7days_count,
    ((max(before7days_count)*1.00)/max(last7days_count))*100.00 as percentage from 
        (
        SELECT COUNT(DISTINCT account_type) as last7days_count, 0 as before7days_count
        FROM account
        WHERE date_created > NOW() - INTERVAL 7 DAY

        union all

        SELECT 0 as last7days_count COUNT(DISTINCT account_type) as before7days_count
        FROM account
        WHERE date_created < NOW() - INTERVAL 7 DAY
        ) as T

Ещё вопросы

Сообщество Overcoder
Наверх
Меню