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