实现同环比的简单SQL

同环比是企业最常见的需求之一,如何快速的在数据库中实现同环比,以下为本人得到的一些简单经验,还望大神指正:

一、在程序中定义变量实现
要在程序中定义变量,那么就是研究如何得到取同环比的sql语句。

建立一张用于试验的表,内容包括日期、数量、吊牌金额和成交金额

SQL> create table retail(id number(10,0) primary key,billdate varchar2(8) not null,qty number(6,0) not null,tot_amt_list number(8,2) not null,tot_amt_actual number(8,2) not null);

Table created.

SQL> desc retail;

Name                          Null?    Type          
---------------------------- -------- ----------------------------
 ID                           NOT NULL NUMBER(10)
 BILLDATE                     NOT NULL VARCHAR2(8)
 QTY                          NOT NULL NUMBER(6)
 TOT_AMT_LIST                 NOT NULL NUMBER(8,2)
 TOT_AMT_ACTUAL               NOT NULL NUMBER(8,2)

SQL> select * from retail where billdate between 20170501 and 20170503;

        ID BILLDATE      QTY TOT_AMT_LIST TOT_AMT_ACTUAL
---------- -------- ---------- ------------ --------------
  1001     20170501        3          12000      10000
  1002     20170502        2          11000       9000
  1003     20170503        1          10000       8000

SQL> select * from retail where billdate between 20160501 and 20160503;

       ID BILLDATE        QTY   TOT_AMT_LIST TOT_AMT_ACTUAL
---------- -------- ---------- ------------ --------------
  1004     20160501        5          10000       8000
  1005     20160502        5          15000       8000
  1006     20160503        1           5000       5000

SQL> select * from retail where billdate between 20170401 and 20170403;

        ID BILLDATE       QTY TOT_AMT_LIST TOT_AMT_ACTUAL
---------- -------- ---------- ------------ --------------
  1007     20170401        2          1
### SQL中计算比和环比的方法与示例 在SQL中,计算比和环比是数据分析中的常见任务。以下将详细介绍如何通过SQL实现这些计算。 #### 1. 计算比是指与去年相比的增长率。可以通过将当前数据与去年一时的对应数据进行比较来计算。以下是基于SQL Server的示例代码: ```sql SELECT TO_CHAR(sales_date, 'YYYY-MM') AS sales_month, SUM(amount) AS current_month_sales, LAG(SUM(amount), 12) OVER (ORDER BY TO_CHAR(sales_date, 'YYYY-MM')) AS last_year_sales, CASE WHEN LAG(SUM(amount), 12) OVER (ORDER BY TO_CHAR(sales_date, 'YYYY-MM')) = 0 THEN NULL ELSE (SUM(amount) - LAG(SUM(amount), 12) OVER (ORDER BY TO_CHAR(sales_date, 'YYYY-MM'))) / LAG(SUM(amount), 12) OVER (ORDER BY TO_CHAR(sales_date, 'YYYY-MM')) * 100 END AS yoy_growth_rate FROM sales_data WHERE sales_date >= TRUNC(ADD_MONTHS(SYSDATE, -12), 'MM') GROUP BY TO_CHAR(sales_date, 'YYYY-MM') ORDER BY sales_month; ``` 此查询使用了`LAG`窗口函数来获取去年一月份的数据,并计算比增长率[^4]。 #### 2. 计算环比 环比是指与上一相比的增长率。通常可以通过自连接或窗口函数实现。以下是基于MySQL的示例代码: ```sql SELECT a.month, a.revenue, b.revenue AS last_month_revenue, CASE WHEN b.revenue = 0 THEN NULL ELSE (a.revenue - b.revenue) / b.revenue * 100 END AS mom_growth FROM sales a LEFT JOIN sales b ON a.month = DATE_ADD(b.month, INTERVAL 1 MONTH) ORDER BY a.month; ``` 在此查询中,通过`LEFT JOIN`将当前月与上一月的数据关联起来,并计算月度增长率[^2]。 #### 3. 使用聚合函数处理特殊情况 在某些情况下,可能需要处理没有前一月或去年数据的情况。例如,在Flink SQL中可以这样实现: ```sql SELECT verify_month, SUM(quantity) AS current_quantity, LAG(SUM(quantity), 1) OVER (ORDER BY verify_month) AS last_month_quantity, LAG(SUM(quantity), 12) OVER (ORDER BY verify_month) AS last_year_quantity, CASE WHEN LAG(SUM(quantity), 12) OVER (ORDER BY verify_month) = 0 THEN NULL ELSE (SUM(quantity) - LAG(SUM(quantity), 12) OVER (ORDER BY verify_month)) / LAG(SUM(quantity), 12) OVER (ORDER BY verify_month) * 100 END AS yoy_growth_rate, CASE WHEN LAG(SUM(quantity), 1) OVER (ORDER BY verify_month) = 0 THEN NULL ELSE (SUM(quantity) - LAG(SUM(quantity), 1) OVER (ORDER BY verify_month)) / LAG(SUM(quantity), 1) OVER (ORDER BY verify_month) * 100 END AS mom_growth_rate FROM sales_data GROUP BY verify_month ORDER BY verify_month; ``` 该查询时计算了比和环比,并且考虑了分母为零的情况[^3]。 #### 4. 简单示例:基于用户登录次数 以下是一个简单的示例,展示如何计算用户的环比增长率: ```sql SELECT t.username, t.logincountnow, t2.logincountlastyear, CASE WHEN t2.logincountlastyear = 0 THEN NULL ELSE (t.logincountnow / t2.logincountlastyear) - 1 END AS growth_rate FROM ( SELECT t.username, COUNT(*) AS logincountnow FROM logintime t WHERE YEAR(logintime) = '2019' GROUP BY t.username ) t LEFT JOIN ( SELECT t.username, COUNT(*) AS logincountlastyear FROM logintime t WHERE YEAR(logintime) = '2018' GROUP BY t.username ) t2 ON t.username = t2.username; ``` 此查询通过子查询分别统计了两年的登录次数,并计算了增长比率[^5]。 ### 注意事项 - 在计算比和环比时,需特别注意日字段的格式是否一致。 - 如果存在分母为零的情况,应明确处理逻辑以避免错误。 - 不数据库系统(如Oracle、MySQL、PostgreSQL等)可能存在语法差异,需根据具体境调整查询。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值