1

我有一个有 2 个字段的表,如下所示:

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 (sum(Value_col) of 3 days after - if have 3 days or more will be sum, if less 3 days don't sum),然后收到这样的结果:

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

请帮忙

4

3 回答 3

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
于 2013-06-06T14:34:25.560 回答
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  --
于 2013-06-06T14:53:27.927 回答
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 更改为您的表名...

我希望这能帮到您!

于 2013-06-06T15:18:22.380 回答