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
相关推荐
用户0328472220701 天前
如何搭建本地yum源(上)
运维
倔强的石头_2 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab3 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence3 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神3 天前
三、用户与权限管理
数据库·mysql
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz4 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信