Вы можете использовать условное агрегирование, чтобы найти итоги:
SELECT SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE )
AND "DATE" <= SYSDATE
THEN AMOUNT
ELSE NULL
END
) AS total_today,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '1' DAY
AND "DATE" < TRUNC( SYSDATE )
THEN AMOUNT
ELSE NULL
END
) AS total_yesterday,
SUM(
CASE
WHEN "DATE" >= NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '7' DAY, 'SUNDAY' )
AND "DATE" <= SYSDATE
THEN AMOUNT
ELSE NULL
END
) AS total_this_week,
SUM(
CASE
WHEN "DATE" >= NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '14' DAY, 'SUNDAY' )
AND "DATE" < NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '7' DAY, 'SUNDAY' )
THEN AMOUNT
ELSE NULL
END
) AS total_last_week,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE, 'IW' ),
AND "DATE" <= SYSDATE
THEN AMOUNT
ELSE NULL
END
) AS total_this_iso_week,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE, 'IW' ) - INTERVAL '7' DAY,
AND "DATE" < TRUNC( SYSDATE, 'IW' )
THEN AMOUNT
ELSE NULL
END
) AS total_last_iso_week,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '6' DAY,
AND "DATE" <= SYSDATE
THEN AMOUNT
ELSE NULL
END
) AS total_this_7_days,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '13' DAY,
AND "DATE" < TRUNC( SYSDATE ) - INTERVAL '6' DAY
THEN AMOUNT
ELSE NULL
END
) AS total_last_7_days,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE, 'MM' )
AND "DATE" <= SYSDATE
THEN AMOUNT
ELSE NULL
END
) AS total_this_month
SUM(
CASE
WHEN "DATE" >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
AND "DATE" < TRUNC( SYSDATE, 'MM' )
THEN AMOUNT
ELSE NULL
END
) AS total_this_month
FROM tb_sales
WHERE "DATE" >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
AND "DATE" <= SYSDATE;
Здесь будут найдены итоги за:
- Сегодня и вчера;
- На этой неделе и на прошлой неделе (с полуночи воскресенья до полуночи следующего воскресенья или до этого момента, в зависимости от того, что наступит раньше);
- Эта неделя ISO 8601 и последняя неделя ISO 8601 (начиная с полуночи понедельника);
- Последние 7 дней (сегодня и предыдущие 6 дней) и 7 дней до этого; и
- Этот месяц и последний месяц (с полуночи первого дня месяца до этого момента).
Если вы хотите, чтобы процентное увеличение увеличилось по сравнению с предыдущим периодом, то:
SELECT 100 * ( total_this_today / total_yesterday - 1 ) AS percent_increase_this_today,
100 * ( total_this_week / total_last_week - 1 ) AS percent_increase_this_week,
100 * ( total_this_iso_week / total_last_iso_week - 1 ) AS percent_increase_this_iso_week,
100 * ( total_this_7_days / total_last_7_days - 1 ) AS percent_increase_this_7_days,
100 * ( total_this_month / total_last_month - 1 ) AS percent_increase_this_month
FROM (
SELECT SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE )
AND "DATE" <= SYSDATE
THEN AMOUNT
ELSE NULL
END
) AS total_today,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '1' DAY
AND "DATE" < TRUNC( SYSDATE )
THEN AMOUNT
ELSE NULL
END
) AS total_yesterday,
SUM(
CASE
WHEN "DATE" >= NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '7' DAY, 'SUNDAY' )
AND "DATE" <= SYSDATE
THEN AMOUNT
ELSE NULL
END
) AS total_this_week,
SUM(
CASE
WHEN "DATE" >= NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '14' DAY, 'SUNDAY' )
AND "DATE" < NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '7' DAY, 'SUNDAY' )
THEN AMOUNT
ELSE NULL
END
) AS total_last_week,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE, 'IW' ),
AND "DATE" <= SYSDATE
THEN AMOUNT
ELSE NULL
END
) AS total_this_iso_week,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE, 'IW' ) - INTERVAL '7' DAY,
AND "DATE" < TRUNC( SYSDATE, 'IW' )
THEN AMOUNT
ELSE NULL
END
) AS total_last_iso_week,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '6' DAY,
AND "DATE" <= SYSDATE
THEN AMOUNT
ELSE NULL
END
) AS total_this_7_days,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '13' DAY,
AND "DATE" < TRUNC( SYSDATE ) - INTERVAL '6' DAY
THEN AMOUNT
ELSE NULL
END
) AS total_last_7_days,
SUM(
CASE
WHEN "DATE" >= TRUNC( SYSDATE, 'MM' )
AND "DATE" <= SYSDATE
THEN AMOUNT
ELSE NULL
END
) AS total_this_month
SUM(
CASE
WHEN "DATE" >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
AND "DATE" < TRUNC( SYSDATE, 'MM' )
THEN AMOUNT
ELSE NULL
END
) AS total_this_month
FROM tb_sales
WHERE "DATE" >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
AND "DATE" <= SYSDATE
)