SQL——处理行的累加

背景:

现在有一张报表,其中上面的数据是商家的订单数据,按照天统计的,要从订单表查出每天的某个商家的订单量,然后去日收益表查出这天的这个商家的收益额,然后还要统计出在某天之前的所有收益额,然后从查出的这种表里筛选出某个时间段的记录。

下面是SQL:

ALTER PROCEDURE [dbo].[sp_LoadSellerDataByTime]

	@SellerCode NVARCHAR(36), --商家编码
	@StartTime CHAR(20), --起始日期
	@EndTime CHAR(20),	--终止日期

	@pageSize INT=31, --一页内有多少条数据
	@pageIndex INT=1 --第几页 

AS

	DECLARE @totalCount INT --返回数据条数

--每日营业额表
SELECT * INTO #temp_Count FROM(
	SELECT  

		LEFT(convert(varchar,table0.CreateTime,21),10) AS MonthDate/*本条日期*/,
		SUM(table0.TotalCharge) AS SumMonthMoney/*今天总营业额*/

	FROM [CommunityCatering].[Catering].[SellerIncome] table0
	WHERE [email protected]/*sellerCode*/
	GROUP BY LEFT(convert(varchar,table0.CreateTime,21),10) 

) AS tempCount

--查总金额
SELECT * INTO #MainTable FROM(

SELECT MonthDate,SumMonthMoney,SumTotalMoney,ISNULL(TotalCount,0) AS TotalCount FROM (

	SELECT MonthDate,SumMonthMoney,
		SumTotalMoney=(

			SELECT SUM(SumMonthMoney)
		    FROM #temp_Count t1
			WHERE t1.MonthDate<=t2.MonthDate

		)

	 FROM #temp_Count t2

)AS SI

LEFT JOIN(/*查每日订单数量*/

	 SELECT
	 LEFT(convert(varchar,Ord.CompleteTime,21),10) AS MonthDate1,
	 COUNT(1) AS TotalCount/*订单数量*/

	 FROM CommunityCatering.Catering.[Order] Ord
	 WHERE ord.CompleteTime IS NOT NULL AND ord.ValidStatus=5/*有效性:选择已经完成的订单*/
		AND [email protected]/*商家code*/
	 GROUP BY LEFT(convert(varchar,Ord.CompleteTime,21),10)

) AS temp ON SI.MonthDate=temp.MonthDate1

) AS MainTable

	 SELECT *,
			ROW_NUMBER() OVER(ORDER BY #MainTable.MonthDate) AS RowNum/*分页需要字段*/
	 FROM  #MainTable WHERE  #MainTable.MonthDate BETWEEN @StartTime AND @EndTime /*去开始时间结束时间的数据*/

  --计算总的数据条数
	 SELECT @totalCount=ISNULL(COUNT(1),0)  FROM #MainTable WHERE #MainTable.MonthDate BETWEEN @StartTime AND @EndTime

 --输出总的数据条数
	 SELECT @totalCount AS TotalCount

--删除临时表
 DROP TABLE #MainTable
 DROP TABLE #temp_Count

如上代码:

例如:第一列代表天,第二列代表当天营业额,第三列代表本天之前的所有营业额,可以看出第三列是第二列的一个累加。

在SQL中,这里首先定义一个临时表,然后使用一个小的嵌套查询,在这个嵌套查询里面,我们计算出前面每天营业额的累加。

时间: 2024-10-12 20:30:34

SQL——处理行的累加的相关文章

dedecms:织梦文章如何添加“自定义属性”标签(sql命令行工具)

dede织梦如何添加“自定义属性”标签“症状” 1.进入后台——系统——SQL命令行工具——运行SQL命令行,添加arcatt表字段: insert into`dede_arcatt`(sortid,att,attname) values(9,'d','症状') 2.添加archives表字段: alter table `dede_archives` modify `flag` set ('h','c','p','f','s','j','a','b','d') default NULL     

解决SQL命令行回退的问题

场景 在linux或者aix上安装后Oracle后,在SQL命令行下无法通过键盘的退格键回退,如下 解决方法 安装软件 # rpm -ivh rlwrap-0.41-1.el6.x86_64.rpm warning: rlwrap-0.41-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEYPreparing...                #############################

SQL Server 行转列

语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现 完整语法: table

做图表统计你需要掌握SQL Server 行转列和列转行

说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据. 1.1 列换行语法 table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 1.2  行转列案例

sql的行转列(PIVOT)与列转行(UNPIVOT)

在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30), --科目 [Score] FLOAT, --成绩 ) INSERT INTO [StudentScores] SE

SQL 多行拼成一行 (3种解决方案)

运行环境 (sql 2000, 2005, 2008, 2014 ), 其中,最后一种方法 专为sql 2000提供. 原数据: (5 行受影响) UserID RoleName RoleID ----------- ---------- -------- 2014000 developer 1 2014000 product 2 2014001 developer 1 2014002 developer 1 2014002 sales 3 期望结果: UserID NewRoleName Ne

深入解析SQL Server行迁移记录

总长未超过8060字节,变长和定长列存储在同一页/记录中的记录称为行内数据记录.行内记录最常见了,因为一般的记录长度都是在8060字节内的.行内记录理论上都是存放在一个页面中的,这种记录的结构相对简单,格式也相对固定. 行内记录会包含一些常见数据类型的列,如int.char(n).varchar(n).datetime2.real.money等.这些类型的数据有变长的也有定长的,所以在更新变长列的数据时,会使记录长度增大,到超出空闲空间容量时,这样即使此记录小于8060字节,也会造成此记录在这一

SQL命令行操作

命令行操作(mysql.exe)    0.登录  :       mysql -u root -p    1.显示数据库列表:    show databases;     2.选择数据库:      use 库名;    3.显示数据表列表     show tables;    4.显示数据表的结构: desc 表名;    5.建库:       create database 库名 charset utf8;    6.建表:       use 库名:     create tabl

SQL锁行 解决多台服务器发送统一请求并发问题

锁行信息SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 存储过程:SET Transaction Isolation Level Read语法的四种情况 这几天一直在弄存储过程,现在在这里跟大伙共享下资料: SET Transaction Isolation Level Read UNCOMMITTED 使用这句东东呢可以分为四种情况,现在就在这里逐一介绍: 第一种情况: READ   COMMITTED 这句的作用是: 指定在读取数据时控制共享