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

发布时间:2023年12月20日

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

文章来源:https://blog.csdn.net/wangqiaowq/article/details/135115371
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。