2013-06-06 9 views
1

У меня есть таблица с 2 поля, как это:MYSQL: выберите сумму (значение)

Day_col | Value_col 
2013-06-06 1 
2013-06-05 2 
2013-06-04 3 
2013-06-03 4 
2013-06-02 5 

И я хочу, чтобы создать SQL (сумма (Value_col) в 3-х дней после того, как - если есть 3 или более дней будет сумма, если менее 3 дней не суммируются), а затем получить результат, как этот:

Day_col | total 
2013-06-06 9  <- total after '2013-06-06' 3 days are 5,4,3 is 9 
2013-06-05 12 <- total after '2013-06-05' 3 days are 4,3,2 is 12 
2013-06-04 -- <- total after '2013-06-04' 2 days don't sum 
2013-06-03 -- <- total after '2013-06-03' 1 days don't sum 
2013-06-02 -- <- total after '2013-06-02' 0 days don't sum 

Пожалуйста, помогите

+3

Можете ли вы сначала написать, что вы пробовали? –

+0

Заполните свой SQL-запрос –

ответ

0
SELECT 
    Day_col, 
    IF (
     (SELECT COUNT(Value_col) FROM myTable AS subT WHERE subT.Day_col < t.Day_col) >= 3, 
     (SELECT SUM(Value_col) FROM myTable AS subT WHERE subT.Day_col < t.Day_col and DATE_ADD(subT.Day_col, INTERVAL 3 DAY) >= t.Day_col), 
     '--' 
    ) AS total 
FROM 
    myTable t 
+0

. Конечно, вам нужно изменить 'myTable' в свое имя таблицы –

0
CREATE TABLE foo 
    (`Day_col` varchar(10), `Value_col` int) 
; 

INSERT INTO foo 
    (`Day_col`, `Value_col`) 
VALUES 
    ('2013-06-06', 1), 
    ('2013-06-05', 2), 
    ('2013-06-04', 3), 
    ('2013-06-03', 4), 
    ('2013-06-02', 5) 
; 

SELECT 
Day_col, 
IF (
(SELECT COUNT(Value_col) FROM foo AS sf WHERE sf.Day_col < f.Day_col) >= 3, 
(SELECT SUM(Value_col) FROM foo AS sf WHERE sf.Day_col >= f.Day_col - INTERVAL 3 DAY and sf.Day_col < f.Day_col), 
'--' 
) AS total 
FROM 
foo f; 

Результат:

DAY_COL  TOTAL 
2013-06-06 9 
2013-06-05 12 
2013-06-04 -- 
2013-06-03 -- 
2013-06-02 -- 
0

Чтобы сделать уборщика запрос, я хотел бы предложить вам создать простую функцию:

DELIMITER $$ 
DROP FUNCTION IF EXISTS `getSum`$$ 
CREATE FUNCTION `getSum`(a DATE) RETURNS INT DETERMINISTIC 
    BEGIN 

     DECLARE ret INT DEFAULT 0; 
     DECLARE ct INT DEFAULT 0; 

     SELECT COUNT(Day_col), COALESCE(SUM(Value_col),0) INTO ct, ret 
     FROM YOUR_TABLE WHERE Day_col < a AND Day_col >= DATE_SUB(a,INTERVAL 3 DAY); 

     IF(ct>=3) THEN RETURN ret; 
     ELSE RETURN NULL; 
     END IF; 

    END$$ 

DELIMITER ; 

И затем, просто используйте запрос:

SELECT Day_col, IF(getSum(Day_col) IS NOT NULL, getSum(Day_col), '--') AS total FROM YOUR_TABLE 

или если вы хотите исключить дни «-»:

SELECT Day_col, getSum(Day_col) AS total FROM YOUR_TABLE WHERE getSum(Day_col) IS NOT NULL 

Просто измените YOUR_TABLE на свое имя ...

Надеюсь, это поможет!

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