SQL server 计算分月,分年,分季度的同环比

SQL server 计算分月,分年,分季度的环比

--- dbo.ads_product_category_sale_money_yoy_mom_month
    -- Insert statements for procedure here
	-- 开始 TRY 块  
    BEGIN TRY  
        -- 执行可能引发异常的 SQL 语句  
		DELETE FROM dbo.ads_product_category_sale_money_yoy_mom_month WHERE dt = @DateThreshold;
 
		INSERT INTO dbo.ads_product_category_sale_money_yoy_mom_month ([dt],[ym],[ord],[title],[month_money],[previous_month_money],[mom_growth_rate])
		select dt,
		    ym,
			product_sort1,
			product_menuname,
			month_money,
			previous_month_money,
			CASE WHEN previous_month_money = 0 THEN null ELSE ((month_money - previous_month_money) / previous_month_money) * 100 END AS mom_growth_rate
		from(select t2.dt,
			product_sort1,
			product_menuname,
			ym,
			t2.year,
			t2.month,
			t2.month_money,
			case when monthdiff = 1 then previous_month_money else 0 end  previous_month_money
		from(select dt,
				product_sort1,
				product_menuname,
				ym,
				SUBSTRING(ym, 1, 4) AS year,
				CAST(SUBSTRING(ym, 6, 2) AS INT) AS month,
				previous_month,
				month_product_order_sale_money as month_money,
				previous_month_money,
				DATEDIFF(MONTH, CAST(CONCAT(previous_month, '-01') AS DATE) , CAST(CONCAT(ym, '-01') AS DATE)) monthdiff
			from(select
				dt,
				product_sort1,
				product_menuname,
				ym,
				lag(ym, 1, '1970-01') over (partition by product_sort1 order by ym)  previous_month,
				lag(month_product_order_sale_money, 1, 0) over (partition by product_sort1 order by ym) previous_month_money,
				month_product_order_sale_money
				from
				dws_product_category_sale_analyse_month 
			where dt = @DateThreshold ) t1) t2) t3

    END TRY  
      
    -- 开始 CATCH 块  
    BEGIN CATCH  
        -- 捕捉异常并执行特定的操作  
        DECLARE @ErrorMessage51 NVARCHAR(4000);  
        SET @ErrorMessage51 = ERROR_MESSAGE();  
          
        RAISERROR (@ErrorMessage51, 16, 1);  
          
        -- 继续执行其他操作  
        -- ...  
    END CATCH



	--- dbo.ads_product_category_sale_money_yoy_pop_quarter
    -- Insert statements for procedure here
	-- 开始 TRY 块  
    BEGIN TRY  
        -- 执行可能引发异常的 SQL 语句  
		DELETE FROM dbo.ads_product_category_sale_money_yoy_pop_quarter WHERE dt = @DateThreshold;
 
		INSERT INTO dbo.ads_product_category_sale_money_yoy_pop_quarter ([dt],[year],[quarter],[ord],[title],[quarter_money],[previous_quarter_money],[qoq_growth_rate])
		SELECT @DateThreshold as dt,
			year,
			quarter,
			product_sort1,
			    product_menuname,
			quarter_money,
			previous_quarter_money,
			CASE WHEN previous_quarter_money = 0 THEN null ELSE ((quarter_money - previous_quarter_money) / previous_quarter_money) * 100 END AS qoq_growth_rate
		from (
		SELECT 
			year,
			quarter,
			product_sort1,
			product_menuname,
			quarter_money,
			case when (year = previous_year and quarter - previous_quarter = 1) or (year - previous_year = 1 and previous_quarter = 4 and quarter -previous_quarter = -3 ) then previous_quarter_money else 0 end  previous_quarter_money	
		from (
		SELECT 
			year,
			quarter,
			product_sort1,
			product_menuname,
			quarter_money,
			CAST(SUBSTRING(previous_year_quarter, 1, 4) as INT) as previous_year,
			CAST(SUBSTRING(previous_year_quarter, 7, 1) as INT) as  previous_quarter,
			previous_quarter_money
		from(SELECT 
			product_sort1,
			product_menuname,
			year,
			quarter,
			year_quarter,
			LAG(year_quarter, 1, '1970 Q1') OVER (PARTITION BY product_sort1,product_menuname ORDER BY year_quarter) AS previous_year_quarter,
			quarter_money,
			LAG(quarter_money, 1, 0) OVER (PARTITION BY product_sort1,product_menuname ORDER BY year_quarter) AS previous_quarter_money
		FROM (
			SELECT 
				product_sort1,
			    product_menuname,
				year,
				quarter,
				CONCAT([year], ' Q', [quarter]) AS year_quarter,
				quarter_money
			FROM 
			(select product_sort1,
			    product_menuname,
				year,
				quarter,
				sum(month_product_order_sale_money) as quarter_money 
				from dws_product_category_sale_analyse_month 
				WHERE dt = @DateThreshold
				group by product_sort1,product_menuname,year,quarter) t1
			) t3) t4
		) t5
		) t6;

    END TRY  
      
    -- 开始 CATCH 块  
    BEGIN CATCH  
        -- 捕捉异常并执行特定的操作  
        DECLARE @ErrorMessage52 NVARCHAR(4000);  
        SET @ErrorMessage52 = ERROR_MESSAGE();  
          
        RAISERROR (@ErrorMessage52, 16, 1);  
          
        -- 继续执行其他操作  
        -- ...  
    END CATCH



	--- dbo.ads_product_category_sale_money_yoy_year
    -- Insert statements for procedure here
	-- 开始 TRY 块  
    BEGIN TRY  
        -- 执行可能引发异常的 SQL 语句  
		DELETE FROM dbo.ads_product_category_sale_money_yoy_year WHERE dt = @DateThreshold;
 
		INSERT INTO dbo.ads_product_category_sale_money_yoy_year ([dt],[year],[ord],[title],[year_money],[previous_year_money],[yoy_growth_rate])
		select
			@DateThreshold as dt,
			year,
			product_sort1,
		    product_menuname, 
			year_money,
			previous_year_money,
			CASE WHEN previous_year_money = 0 THEN null ELSE ((year_money - previous_year_money) / previous_year_money) * 100 END AS yoy_growth_rate
		from (
		select
		    product_sort1,
		    product_menuname,
			year,
			previous_year,
			year_money,
			case when yeardiff = 1 then previous_year_money else 0 end previous_year_money
        from (select
		    product_sort1,
		    product_menuname, 
			year,
			previous_year,
			year_money,
			previous_year_money,
			year - previous_year as yeardiff
		from (select
		    product_sort1,
		    product_menuname, 
			year,
			lag(cast(year as int ),1,'1970') over (partition by product_sort1 order by year) previous_year,
			year_money,
			lag(year_money, 1, 0) over (partition by product_sort1 order by year) previous_year_money
		from (select 
		        product_sort1,
		        product_menuname,
			    year,
			    sum(month_product_order_sale_money) as year_money 
				from dws_product_category_sale_analyse_month 
				WHERE dt = @DateThreshold
				group by product_sort1,product_menuname,year) t1) t3) t4
		) t2;

    END TRY  
      
    -- 开始 CATCH 块  
    BEGIN CATCH  
        -- 捕捉异常并执行特定的操作  
        DECLARE @ErrorMessage53 NVARCHAR(4000);  
        SET @ErrorMessage53 = ERROR_MESSAGE();  
          
        RAISERROR (@ErrorMessage53, 16, 1);  
          
        -- 继续执行其他操作  
        -- ...  
    END CATCH

SQL server 计算分月,分年,分季度的同环比

--- dbo.ads_sale_money_yoy_mom_month
    -- Insert statements for procedure here
	-- 开始 TRY 块  
    BEGIN TRY  
        -- 执行可能引发异常的 SQL 语句  
		DELETE FROM dbo.ads_sale_money_yoy_mom_month WHERE dt = @DateThreshold;

		WITH sales AS (  
			 SELECT  
				[year],  
				month,  
				[month_sale_money] as month_money,  
				LAG([month_sale_money], 12) OVER (PARTITION BY [year],[month] ORDER BY [year],[month]) AS same_month_last_year_money,  
				ROW_NUMBER() OVER (PARTITION BY [year], [month] ORDER BY [month_sale_money]) AS rn  
			FROM (select 
						year,
						month,
						month_sale_money
					from(select 
						year,
						CAST(SUBSTRING(ym, 6, 2) AS INT) AS month,
						month_sale_money
						from dws_sale_analyse_month where dt = @DateThreshold) t1 			
			) t2
		),  
		months AS (  
			SELECT DISTINCT [year], month FROM sales  
		)  
		INSERT INTO dbo.ads_sale_money_yoy_mom_month ([dt],[ym],[month_money],[previous_month_money],[same_month_last_year_money],[yoy_growth_rate],[mom_growth_rate])
		select 
			@DateThreshold as dt,
			CONCAT(CAST(year AS VARCHAR), '-', FORMAT(month, '00')) AS ym,
			month_money,
			previous_month_money,
			same_month_last_year_money,
			CASE WHEN same_month_last_year_money = 0 THEN null ELSE ((month_money - same_month_last_year_money) / same_month_last_year_money) * 100 END AS yoy_growth_rate,
			CASE WHEN previous_month_money = 0 THEN null ELSE ((month_money - previous_month_money) / previous_month_money) * 100 END AS mom_growth_rate
		from (
			SELECT 
				DISTINCT q.[year],
				q.[month],
				case when s.[month_money] is NULL then 0 else s.[month_money] end AS month_money,    
				case when sqs.[month_money] is NULL then 0 else sqs.[month_money] end AS same_month_last_year_money,
				t4.previous_month_money
			FROM months q  
			JOIN sales s ON q.[year] = s.[year] AND q.[month] = s.[month] AND s.rn = 1  
			LEFT JOIN sales sqs ON q.[year] - 1 = sqs.[year] AND q.[month] = sqs.[month] AND sqs.rn = 1
			left join (
				select t2.dt,
					ym,
					t2.year,
					t2.month,
					t2.month_money,
					case when monthdiff = 1 then previous_month_money else 0 end  previous_month_money
				from(select dt,
						ym,
						SUBSTRING(ym, 1, 4) AS year,
						CAST(SUBSTRING(ym, 6, 2) AS INT) AS month,
						previous_month,
						month_sale_money as month_money,
						previous_month_money,
						DATEDIFF(MONTH, CAST(CONCAT(previous_month, '-01') AS DATE) , CAST(CONCAT(ym, '-01') AS DATE)) monthdiff
					from(select
						dt,
						ym,
						lag(ym, 1, '1970-01') over (partition by dt order by ym)  previous_month,
						lag(month_sale_money, 1, 0) over (partition by dt order by ym) previous_month_money,
						month_sale_money
						from
						dws_sale_analyse_month 
					where dt = @DateThreshold) t1) t2
			) t4 on q.year = t4.year and q.month = t4.month
		) t1;


    END TRY  
      
    -- 开始 CATCH 块  
    BEGIN CATCH  
        -- 捕捉异常并执行特定的操作  
        DECLARE @ErrorMessage23 NVARCHAR(4000);  
        SET @ErrorMessage23 = ERROR_MESSAGE();  
          
        RAISERROR (@ErrorMessage23, 16, 1);  
          
        -- 继续执行其他操作  
        -- ...  
    END CATCH

	
	--- dbo.ads_sale_money_yoy_pop_quarter
    -- Insert statements for procedure here
	-- 开始 TRY 块  
    BEGIN TRY  
        -- 执行可能引发异常的 SQL 语句  
		DELETE FROM dbo.ads_sale_money_yoy_pop_quarter WHERE dt = @DateThreshold;

		WITH sales AS (
			SELECT
				[year],
				[quarter],
				[quarter_money],
				LAG([quarter_money], 2) OVER (PARTITION BY [year], [quarter] ORDER BY [year], [quarter]) AS same_quarter_last_year_money,
				ROW_NUMBER() OVER (PARTITION BY [year], [quarter] ORDER BY [quarter_money]) AS rn
			FROM (SELECT [year]
						,[quarter]
						,sum(month_sale_money) as quarter_money 
					FROM [big_data].[dbo].[dws_sale_analyse_month] where dt = @DateThreshold  
					group by year, quarter
			) t1
		), quarters AS (
			SELECT DISTINCT [year], [quarter] FROM sales
		)
		INSERT INTO dbo.ads_sale_money_yoy_pop_quarter ([dt],[year],[quarter],[quarter_money],[previous_quarter_money],[same_quarter_last_year_money],[yoy_growth_rate],[qoq_growth_rate])
		select 
			@DateThreshold as dt,
			year,
			quarter,
			quarter_money,
			previous_quarter_money,
			same_quarter_last_year_money,
			CASE WHEN same_quarter_last_year_money = 0 THEN null ELSE ((quarter_money - same_quarter_last_year_money) / same_quarter_last_year_money) * 100 END AS yoy_growth_rate,
			CASE WHEN previous_quarter_money = 0 THEN null ELSE ((quarter_money - previous_quarter_money) / previous_quarter_money) * 100 END AS qoq_growth_rate
		from (
			SELECT 
				DISTINCT q.[year],
				q.[quarter],
				case when s.[quarter_money] is NULL then 0 else s.[quarter_money] end AS quarter_money,   
				case when pqs.[previous_quarter_money] is NULL then 0 else pqs.[previous_quarter_money] end AS previous_quarter_money,   
				case when sqs.[quarter_money] is NULL then 0 else sqs.[quarter_money] end AS same_quarter_last_year_money  
			FROM quarters q  
			JOIN sales s ON q.[year] = s.[year] AND q.[quarter] = s.[quarter] AND s.rn = 1   
			LEFT JOIN sales sqs ON q.[year] - 1 = sqs.[year] AND q.[quarter] = sqs.[quarter] AND sqs.rn = 1
			LEFT JOIN (SELECT 
						dt,
						SUBSTRING(year_quarter, 1, 4) AS year,
						SUBSTRING(year_quarter, 7, 1) AS quarter,
						LAG(year_quarter, 1, '1970 Q1') OVER (PARTITION BY dt ORDER BY year_quarter) AS previous_year,
						quarter_money,
						LAG(quarter_money, 1, 0) OVER (PARTITION BY dt ORDER BY year_quarter) AS previous_quarter_money
					FROM (
						SELECT 
							@DateThreshold AS dt, 
							CONCAT([year], ' Q', [quarter]) AS year_quarter,
							SUM(month_sale_money) AS quarter_money
						FROM [big_data].[dbo].[dws_sale_analyse_month] 
						WHERE dt = @DateThreshold  
						GROUP BY CONCAT([year], ' Q', [quarter])
					) t) pqs 
			ON q.[year] = pqs.[year] AND q.[quarter] = pqs.[quarter]
		) t1
		order by year, quarter asc;

    END TRY  
      
    -- 开始 CATCH 块  
    BEGIN CATCH  
        -- 捕捉异常并执行特定的操作  
        DECLARE @ErrorMessage22 NVARCHAR(4000);  
        SET @ErrorMessage22 = ERROR_MESSAGE();  
          
        RAISERROR (@ErrorMessage22, 16, 1);  
          
        -- 继续执行其他操作  
        -- ...  
    END CATCH



	--- dbo.ads_sale_money_yoy_year
    -- Insert statements for procedure here
	-- 开始 TRY 块  
    BEGIN TRY  
        -- 执行可能引发异常的 SQL 语句  
		DELETE FROM dbo.ads_sale_money_yoy_year WHERE dt = @DateThreshold;
 
		INSERT INTO dbo.ads_sale_money_yoy_year ([dt],[year],[year_money],[previous_year_money],[yoy_growth_rate])
		select
			dt,
			year,
			--- lag(cast(year as int ),1,'1970') over (partition by dt order by year) previous_year,
			year_money,
			previous_year_money,
			CASE WHEN previous_year_money = 0 THEN null ELSE ((year_money - previous_year_money) / previous_year_money) * 100 END AS yoy_growth_rate
		from (
		select
			dt,
			year,
			lag(cast(year as int ),1,'1970') over (partition by dt order by year) previous_year,
			year_money,
			lag(year_money, 1, 0) over (partition by dt order by year) previous_year_money
		from (select
				@DateThreshold dt,
				year,
				sum(month_sale_money) as year_money
				from
				dws_sale_analyse_month 
				where dt = @DateThreshold group by year) t1
		) t2;


    END TRY  
      
    -- 开始 CATCH 块  
    BEGIN CATCH  
        -- 捕捉异常并执行特定的操作  
        DECLARE @ErrorMessage24 NVARCHAR(4000);  
        SET @ErrorMessage24 = ERROR_MESSAGE();  
          
        RAISERROR (@ErrorMessage24, 16, 1);  
          
        -- 继续执行其他操作  
        -- ...  
    END CATCH
相关推荐
2401_8401922715 分钟前
OpenStack基础架构
运维·服务器·openstack
小马爱打代码20 分钟前
125个Docker的常用命令
运维·docker·容器
某风吾起22 分钟前
Linux 消息队列的使用方法
java·linux·运维
Elastic 中国社区官方博客30 分钟前
使用 Elasticsearch 导航检索增强生成图表
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
小金的学习笔记34 分钟前
RedisTemplate和Redisson的使用和区别
数据库·redis·缓存
新知图书1 小时前
MySQL用户授权、收回权限与查看权限
数据库·mysql·安全
胡八一1 小时前
解决docker: ‘buildx‘ is not a docker command.
运维·docker·容器
文城5211 小时前
Mysql存储过程(学习自用)
数据库·学习·mysql
沉默的煎蛋1 小时前
MyBatis 注解开发详解
java·数据库·mysql·算法·mybatis
呼啦啦啦啦啦啦啦啦1 小时前
【Redis】事务
数据库·redis·缓存