`

SQL:累计求和的例子

    博客分类:
  • sql
 
阅读更多

例一、譬如实现如下结果

月份(month) 数量(number)   累计数量(total)

2015-03               1                   1

2015-04               2                   3

2015-05               3                   7

2015-03               1                   1

2015-04               2                   3

2015-05               3                   7

-------------------------------------------------------

sql示例如下:

select

 b.month,

 b.number,

 sum(a.month)

from TABLE a

join TABLE b

on a.month=b.month

group by b.month,b.number

小结:其实实现累计的核心就是将相同的表在做一次关联,让里面的值作为比较参数。

 

 

 

例二、有以下表

日期 增加 减少

2015-04-24 18709 12608

2015-04-25 28508 11412

2015-04-26 39092 20858

2015-04-27 80146 57995

2015-04-28 53581 19584

2015-04-29 50609 26319

2015-04-30 52969 28884

2015-05-01 79146 70007

2015-05-02 50536 38031

2015-05-03 58161 42329

2015-05-04 27287 14137

我需要用SQL语句得到下面的东西:

日期 增加 减少 留存率

2015-04-24 18709 12608 =(18709-12608)

2015-04-25 28508 11412 =(18709-12608)+(28508-11412)

2015-04-26 39092 20858 =(18709-12608)+(28508-11412)+( 39092-20858)

2015-04-27 80146 57995 下面依次类推

2015-04-28 53581 19584 …

2015-04-29 50609 26319 …

2015-04-30 52969 28884 …

2015-05-01 79146 70007 …

2015-05-02 50536 38031 …

2015-05-03 58161 42329 …

2015-05-04 27287 14137 …

非递归的写法(应该所有的数据库都支持)

SELECT t1.日期, t1.增加, t1.减少,
           SUM(t2.增加-t2.减少) 留存率
      FROM table1 t1
      JOIN table1 t2
        ON t2.日期 <= t1.日期
  GROUP BY t1.日期, t1.增加, t1.减少

 递归的写法(SQL Server)

WITH t0 AS (
    SELECT *,
           ROW_NUMBER() OVER(ORDER BY 日期) rn
      FROM table1
)
,t AS (
    SELECT rn,
           日期, 增加, 减少,
           (增加-减少) 留存率
      FROM t0
     WHERE rn = 1

    UNION ALL

    SELECT t2.rn,
           t2.日期, t2.增加, t2.减少,
           t1.留存率 + (t2.增加-t2.减少) 留存率
      FROM t t1
      JOIN t0 t2
        ON t2.rn = t1.rn + 1
)
SELECT 日期, 增加, 减少, 留存率
  FROM t

 

 

 

例三(自己写的):

create table #p  
(  
    id int,  
    year varchar(4),  
    month varchar(2),  
    qty int  
)  
   
insert into #p values (1,'2012','1',10);  
insert into #p values (2,'2012','2',15);  
insert into #p values (3,'2012','3',20);  
insert into #p values (4,'2013','5',30);  
insert into #p values (5,'2013','6',35);  
insert into #p values (6,'2013','7',40);  
insert into #p values (7,'2013','8',45)  
insert into #p values (8,'2013','9',50)  
insert into #p values (9,'2013','12',100)  
insert into #p values (10,'2014','1',10);  
insert into #p values (11,'2014','3',15);  
insert into #p values (12,'2014','4',20);  
insert into #p values (13,'2014','5',30);  
insert into #p values (14,'2014','7',40);  
insert into #p values (15,'2014','8',45);  
insert into #p values (16,'2014','9',50);  
insert into #p values (17,'2015','5',30);  
insert into #p values (18,'2016','7',40);  
insert into #p values (19,'2017','8',45);  
insert into #p values (120,'2017','9',50);  
  
select * from #p  

select t1.year,t1.month,SUM(t2.qty) from #p t1 join #p t2 on t1.year=t2.year and cast(t2.month as int)<=cast(t1.month as int) group by t1.year,t1.month order by cast(t1.year as int),cast(t1.month as int)

 

分享到:
评论

相关推荐

    hive级联求和

    在大数据处理领域,Hive 是一个非常重要的工具,它提供了SQL接口来查询和管理大规模数据。...而文档“级联求和.docx”和“面试用神sql--套路--累计报表.txt”提供了更详细的实践案例和面试策略,值得深入学习和参考。

    SQL如何实现阶梯式累加.txt

    本篇文章将详细介绍如何通过SQL语句实现这种累加方式,并通过具体的例子来说明其应用场景及实现过程。 #### 1. 阶梯式累加的概念 阶梯式累加是指按照一定的规则(例如数量、金额等)对数据进行累加处理,通常用于...

    sql面试题(sql查询优化)

    在IT行业的数据库领域,SQL查询优化是至关重要的技术点,特别是在大数据量处理和高并发场景下,优化SQL查询可以显著提升系统的性能和响应速度。本文将深入探讨SQL查询优化的关键知识点,包括常见的优化策略、查询...

    sql经典7道面试题

    随后的查询语句通过子查询计算每年及以前所有年份的薪资总额,这是通过将当前年份与之前所有年份的数据进行比较并求和实现的。另一种方法是使用`JOIN`操作,连接自身来完成相同的目标,即通过`GROUP BY`和`ORDER BY`...

    sql迭代查询分享.pdf

    下面是一个如何创建这个函数的例子: ```sql create function mysum(@xh int, @price int) returns int begin return (select (case when totalprice is null then @price else totalprice end) as totalprice ...

    tp5 sum某个字段相加得到总数的例子

    `sum` 是一个非常实用的功能,它允许开发者快速地对数据库表中的数值字段进行求和操作,这对于统计分析或报表生成等场景特别有用。 首先,我们要明白 `sum` 方法是tp5中模型或查询构造器提供的功能之一,用于计算...

    企业面试sql题(含答案).docx

    在这个企业面试问题中,我们需要使用SQL来统计每个用户在每个月的累计访问次数。以下将详细解释这个问题的解决方案及其涉及到的SQL知识点。 首先,我们创建了一个名为`first`的表,其中包含三个字段:`userid`...

    有幸去华为面试数据分析岗,看到SQL后我拒绝了.docx

    此外,文中还提及了使用窗口函数(Window Function)进行聚合的例子,如`ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`等,这些函数允许在结果集内进行更复杂的计算,如计算排名或计算连续时间段内的累计值。例如,窗口...

    Oracle分析函数详解.doc

    - **SUM()**:对一组行的某个列进行累计求和。 - **AVG()**:计算平均值,考虑了NULL值的影响。 - **COUNT()**:计算行数,可选择性地忽略NULL值。 - **RANK()**:为每一行分配一个唯一的排名,基于指定的排序顺序。...

    Orcal中over函数.doc

    它可以帮助我们对数据进行分组、排序、累计等多种处理,大大增强了SQL语言的数据分析能力。本文将详细介绍OVER函数的基本用法以及几个常见应用场景。 #### 二、基本语法 OVER函数的一般语法形式为: ```sql ...

    使用over函数实现递归汇总计算

    为了更深入地理解分析函数的实际应用场景,我们通过一个具体的例子来进行说明。 ##### 3.1 测试环境设置 假设有一个销售表 `t_sales`,存储客户的销售明细。表结构如下: ```sql CREATE TABLE t_sales ( ...

    SQL2005 学习笔记 窗口函数(OVER)

    这种函数使得处理复杂的统计计算变得更为简便,比如累计求和、移动平均以及计算排名等。 1. **窗口函数的基本概念** - **窗口(Window)**:窗口是用户自定义的一组行,这些行通常基于某种排序或分区规则。用户...

    SQL对数据进行按月统计或对数据进行按星期统计的实例代码

    5. **SUM() 函数**:对指定列的值求和。在这个例子中,每个CASE语句的SUM()函数用于计算特定月份的提现总额。 6. **AS** 关键字:用于重命名列名。例如,`as '0'`将对应的SUM结果命名为'0',以此类推,对应不同月份...

    Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数(转载)

    这段SQL语句按日期顺序计算销售量的累计总和。 **示例2:按部门统计薪资百分比** ```sql SELECT name, dept, sal, sal * 100 / SUM(sal) OVER (PARTITION BY dept) AS percent FROM salary; ``` 此查询按部门分组...

    SQL循环结构程序复习题.pdf

    在SQL中,累加求和可以通过在循环体内不断累加变量实现,如计算1到100之间偶数之和的例子。 9. **寻找序列规律并终止循环**: 计算级数问题通常需要找到序列的规律,并根据这个规律来确定何时结束循环。例如,...

    Oracle分析函数

    在这个例子中,`SUM`函数应用在一个按部门分组并按销售额排序的窗口上,计算出每个部门内销售额的累计总和。 Oracle分析函数极大地提高了SQL查询的灵活性和效率,使得数据分析和报告变得更加便捷。熟练掌握这些函数...

    SQL面试题:求时间差之和(有重复不计)

    在SQL面试中,经常会有涉及复杂查询的问题,如本题所示,要求计算每个品牌的累计促销天数,同时排除日期重复的情况。这个问题的核心在于如何正确处理日期间的重叠,并且有效地计算非重叠部分的总天数。下面我们将...

    Oracle之分析函数讲解及PPT资源.zip

    这使得我们可以实现行级别的累计求和、平均值等统计计算。 举个例子,假设我们有一个销售表,包含产品ID、销售日期和销售额,我们可以使用分析函数来计算每种产品的累计销售额: ```sql SELECT product_id, sale_...

    oracle10g分析函數

    这使得它们能够生成如累计求和、排名、百分比和移动平均等统计信息。 1. RANK() 函数:此函数返回一个序列号,表示行在其分组内的相对位置。如果有多个行具有相同的值,它们将被赋予相同的排名,并且后续行的排名会...

Global site tag (gtag.js) - Google Analytics