db2并排比较年份和月份

时间:2018-03-28 03:20:36

标签: sql db2

我需要将当前年度与去年及当月与上一年同月的公司价值并列比较。

我使用此查询来获取值

SELECT STORE, SUM(TOTAL) as VAL, DATE FROM MYTABLE 
WHERE DATE=CURRENT_DATE GROUP BY STORE ORDER BY STORE

低于结果

STORE  |  VAL  |  DATE
  1       10      CURRENT_DATE (2018-27-03)
  1       20      2018-26-03
  1       30      2018-25-03
  2       20      CURRENT_DATE (2018-27-03)
  2       20      2018-26-02

我需要这个

STORE  | VALUE CURRENT YEAR | VALUE LAST YEAR      
1        60                   30 (CALCULATED)    
2        40                   50 (CALCULATED)

STORE  | VALUE CURRENT MONTH | VALUE SAME MONTH OF LAST YEAR 
1        60                    30 (CALCULATED)      
2        20                    50 (CALCULATED)

谢谢

2 个答案:

答案 0 :(得分:0)

您可以一起加入两个子选项。

使用此DDL和数据

const char* o[2] = { 
     "Heads", "Tails"       //Where the words heads and tails are stored 
     };

//Coin Flip begins
    printf("\nType 'h' for heads & 't' for tails\n");
    printf("\nHeads or Tails? \n");
    scanf("%c", &a);
    //sleep(3);
    printf("%s\n",o[cool()]); //random heads or tails generated
    //sleep(3);


    if ( o == "Heads" && a == 'h' || o== "Heads" a == 'H' )
    {
        printf("\nCorrect!\n");

    }

    return 0;

}

这将为您提供当前月份和去年上个月的值

CREATE TABLE MYTABLE (STORE int,  VAL int, D DATE);
INSERT INTO MYTABLE VALUES
 ( 1, 10, '2018-03-27')
,( 1, 20, '2018-03-26')
,( 1, 10, '2018-02-25')
,( 1, 35, '2017-03-25')
,( 2, 20, '2018-03-27')
,( 2, 15, '2017-03-26');

然后这多年

SELECT C.*, LY.VAL_CURR_MONTH_LY
FROM (
    SELECT STORE, SUM(VAL) as VAL_CURR_MONTH
    FROM MYTABLE WHERE INT(D)/100=INT(CURRENT_DATE)/100
    GROUP BY STORE ) AS C
LEFT JOIN
    (SELECT STORE
    ,       SUM(VAL) AS VAL_CURR_MONTH_LY
    FROM MYTABLE
     WHERE INT(D)/100 = INT(CURRENT_DATE)/100 -100
     GROUP BY STORE ) LY
ON
    C.STORE = LY.STORE

P.S。还有很多其他方法可以操作日期,但是转换为INT可能是更简单的方法之一

此外,这是一种更灵活的方式来获得去年同期的#34;值。类似的方法可以在去年获得""值。

SELECT C.*, LY.VAL_LY
FROM (
    SELECT STORE, SUM(VAL) as VAL_CURR_YEAR
    FROM MYTABLE WHERE INT(D)/10000=INT(CURRENT_DATE)/10000
    GROUP BY STORE ) AS C
LEFT JOIN
    (SELECT STORE
    ,       SUM(VAL) AS VAL_LY
    FROM MYTABLE
     WHERE INT(D)/10000 = INT(CURRENT_DATE)/10000 -1
     GROUP BY STORE ) LY
ON
    C.STORE = LY.STORE

给出

SELECT T.*
,      AVG(VAL) OVER(
        PARTITION BY STORE 
        ORDER BY YEAR_MONTH
        RANGE BETWEEN 101 PRECEDING AND 100 PRECEDING
       ) AS SAME_MONTH_PREV_YEAR
FROM 
(   SELECT STORE
    ,      INTEGER(D)/100 AS YEAR_MONTH
    ,      SUM(VAL) AS VAL
    FROM    
        MYTABLE T
    GROUP BY
           STORE
    ,      INTEGER(D)/100
) AS T
;

答案 1 :(得分:0)

最好避免where子句中的表列上的函数。检查以下基于P. Vernon样本表的SQL。

注意:这些SQL适用于DB2 LUW 11.1

月份:

SELECT STORE, 
       SUM(CASE WHEN YEAR(D) = year(current date) THEN val 
                ELSE 0 END) as VAL_CURR_MONTH, 
       SUM(CASE WHEN YEAR(D) = year(current date) - 1 THEN vaL 
                ELSE 0 END) as VAL_CURR_MONTH_LY
FROM MYTABLE 
WHERE D between first_day(current date) and last_day(current date)
      or D between first_day(current date - 1 year) and last_day(current date - 1 year) 
GROUP BY STORE 
ORDER BY STORE

一年:

SELECT STORE, SUM(CASE WHEN YEAR(D) = year(current date) THEN val
                       ELSE 0 END) as VAL_CY, 
              SUM(CASE WHEN YEAR(D) = year(current date) - 1 THEN vaL
                       ELSE 0 END) as VAL_LY
FROM MYTABLE 
WHERE D between first_day(current date - (month(current date) - 1) months) 
                and last_day(current date + (12 - month(current date)) months)
      or D between first_day(current date - (month(current date) - 1) months - 1 year) 
                   and last_day(current date + (12 - month(current date)) months - 1 year) 

GROUP BY STORE 
ORDER BY STORE
相关问题