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
相关推荐
LKAI.9 分钟前
搭建Elastic search群集
linux·运维·elasticsearch·搜索引擎
dazhong201240 分钟前
PLSQL 客户端连接 Oracle 数据库配置
数据库·oracle
正在走向自律1 小时前
阿里云ESC服务器一次性全部迁移到另一个ESC
服务器·阿里云·云计算
gywl2 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
青木沐2 小时前
Jenkins介绍
运维·jenkins
WTT00112 小时前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
苹果醋32 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
了一li3 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
日记跟新中3 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器