设为首页 加入收藏

TOP

MSSQL借助临时表处理获取复杂结果
2015-07-24 10:40:54 来源: 作者: 【 】 浏览:1
Tags:MSSQL 借助 临时 处理 获取 复杂 结果

如果我们需要多步的操作,或者需要从不同的数据源表取数据组合,这时候可能就需要临时表来存储中间结果。

举一个简单的例子,我们有淘宝每天的销售额以及天猫每天的销售额分表在不同的表中存储。而我们的需求是将每个月淘宝以及天猫的销售额输出。

思路:

1. 先将淘宝和天猫按照月份的销售额数据获取到,然后再join

2. 要按照月份汇总销售额需要先将记录日期转化为月份得到新的表再按照月份group

CREATE PROCEDURE [dbo].[sp_GetMonthMetric]
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON; 

	DECLARE @Day DateTime
	SET @Day=dateadd(month,0,convert(varchar(10),getdate(),120))

	DECLARE @Months int
	SET @Months=6

	-- Text Ads
	SELECT 
			LEFT(convert(varchar(10),Date,120),7) AS MON,
			Revenue,
			SRPV
	INTO #TA
	FROM [dbo].[Taobao_Daily]
	WHERE 
			LEFT(convert(varchar(10),Date,120),7) >= LEFT(convert(varchar(10),dateadd(month,-@Months,convert(varchar(10),@Day,120)),120),7)
		AND	LEFT(convert(varchar(10),Date,120),7) < LEFT(convert(varchar(10),@Day,120),7);

	SELECT 
			MON,
			SUM(Revenue) AS Revenue_TA,
			SUM(SRPV) AS SRPV
	INTO #TA_MON
	FROM #TA
	GROUP BY MON;
	
	-- TM
    SELECT 
			LEFT(convert(varchar(10),Date,120),7) AS MON,
			TMRevenue
	INTO #TM
	FROM [dbo].[Tmall_Daily]
	WHERE 
			LEFT(convert(varchar(10),Date,120),7) >= LEFT(convert(varchar(10),dateadd(month,-@Months,convert(varchar(10),@Day,120)),120),7)
		AND	LEFT(convert(varchar(10),Date,120),7) < LEFT(convert(varchar(10),@Day,120),7);

	SELECT 
			MON,
			SUM(TMRevenue) AS Revenue_TM
	INTO #TM_MON
	FROM #TM
	GROUP BY MON;

	-- ALP
	SELECT 
			LEFT(convert(varchar(10),Date,120),7) AS MON,
			Revenue
	INTO #ALP
	FROM [dbo].[Alipay_Daily]
	WHERE 
			LEFT(convert(varchar(10),Date,120),7) >= LEFT(convert(varchar(10),dateadd(month,-@Months,convert(varchar(10),@Day,120)),120),7)
		AND	LEFT(convert(varchar(10),Date,120),7) < LEFT(convert(varchar(10),@Day,120),7);

    SELECT 
			MON,
			SUM(Revenue) AS Revenue_ALP
	INTO #ALP_MON
	FROM #ALP
	GROUP BY MON;

	SELECT 
			#TA_MON.MON AS [Month],
			SRPV,
			Revenue_TA,
			coalesce(Revenue_TM,0) AS Revenue_TM,
			coalesce(Revenue_ALP,0) AS Revenue_ALP,
			Revenue_TA+Revenue_TM+Revenue_ALP AS Revenue_Overall,
			(Revenue_TA+Revenue_TM+Revenue_ALP)*1000/SRPV AS RPM
	INTO #CUR
	FROM #TA_MON
	LEFT JOIN #TM_MON ON #TA_MON.MON = #TM_MON.MON
	LEFT JOIN #ALP_MON ON #TA_MON.MON = #ALP_MON.MON;

	SELECT 
			[Month],
			SRPV,
			Revenue_TA,
			Revenue_TM,
			Revenue_ALP,
			Revenue_TA+Revenue_TM+Revenue_ALP AS Revenue_Overall,
			(Revenue_TA+Revenue_TM+Revenue_ALP)*1000/SRPV AS RPM
	FROM #CUR;

	DROP TABLE #TA_MON;
	DROP TABLE #TM_MON;
	DROP TABLE #ALP_MON;
	DROP TABLE #TA;
	DROP TABLE #TM;
	DROP TABLE #ALP;
	DROP TABLE #CUR;

END

上面这个代码是建立了一个存储过程来存储从三个数据源表汇总的最近六个月的月份KPI。对于Join中如果没有数据想默认设为0,可以用函数coalesce(col, defaultvalue)

代码示例中的“SELECT * INTO #TAB WHERE *”的代码即是建立了临时表,主要用#前缀表示,使用完毕后需要删除掉。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SQL从头开始 下一篇数据库-数据库完整性

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)
·Redis - The Real-ti (2025-12-26 08:20:50)
·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)