2015-12-03 3 views
1

Я пытаюсь получить общую сумму столбца и сумму того же столбца между двумя датами в одном запросе. Это возможно?MYSQL получает общую сумму и сумму между 2 датами в 1 запросе

Моя таблица выглядит следующим образом:

uid|amount|date 

два запроса я пытаюсь сделать одно из:

SELECT sum(amount) as `keys` FROM tbl_keys WHERE uid = 1 

SELECT sum(amount) as `keys` FROM tbl_keys WHERE uid = 1 AND YEAR(`date`) = YEAR(CURRENT_DATE) 
AND MONTH(`date`) = MONTH(CURRENT_DATE) 

ответ

2

Вы можете использовать UNION запрос:

SELECT 'All' AS cnt, sum(amount) as `keys` FROM tbl_keys WHERE uid = 1 
UNION ALL 
SELECT 'Current_month' AS cnt, sum(amount) as `keys` 
FROM tbl_keys 
WHERE 
    uid = 1 
    AND `date`<= last_day(current_date) 
    `date`>= current_date - interval (day(current_date)-1) day 

(я предпочитаю использовать >= и <= на колонке даты, так как он может использовать индекс, если присутствует, в то время как функции, как MONTH() или YEAR() не может, также я предполагаю, что date является столбцом датыd и что он не содержит информации о времени).

Если вы хотите результат в одной строке, вы можете использовать встроенный запрос:

SELECT 
    (SELECT sum(amount) as `keys` FROM tbl_keys WHERE uid = 1) AS total, 
    (SELECT sum(amount) as `keys` 
    FROM tbl_keys 
    WHERE 
    uid = 1 
    AND `date`<= last_day(current_date) 
    `date`>= current_date - interval (day(current_date)-1) day 
    ) AS current_month 
+0

Спасибо за ваш ответ – Maantje

1

Что-то вроде этого:

SELECT sum(amount) as `keys`, 
(
    SELECT sum(t.amount) 
    FROM tbl_keys as t 
    WHERE t.uid = tbl_keys.uid AND YEAR(t.`date`) = YEAR(CURRENT_DATE) 
    AND MONTH(t.`date`) = MONTH(CURRENT_DATE) 
) as `keys2` 
FROM tbl_keys 
WHERE uid = 1 
+0

Спасибо за ваш ответ – Maantje

+0

@marsje Вы долгожданная –

1
SELECT sum(amount) AS `keys` 
FROM (
SELECT amount FROM tbl_keys 
UNION ALL 
SELECT amount FROM tbl_keys 
WHERE uid = 1 
AND YEAR(`date`) = YEAR(CURRENT_DATE) 
AND MONTH(`date`) = MONTH(CURRENT_DATE) 
) AS new_table; 

Использование a UNION статья, вы получите желаемый результат, который вы хотите.

+0

Спасибо за ваш ответ – Maantje

+0

Вы радушны :) –

0

Используйте СЛУЧАЙ рассчитывать только сумму за указанную дату:

SELECT SUM(amount) AS `keys`, 
    SUM(CASE WHEN YEAR(`date`) = YEAR(CURRENT_DATE) 
     AND MONTH(`date`) = MONTH(CURRENT_DATE) THEN amount ELSE 0 END) AS 'keys2' 
    FROM tbl_keys 
    WHERE uid = 1 
; 

Я думаю, что это будет работать более эффективно, чем решение, используя UNION SELECT.

Смежные вопросы