declare @dateFrom [date] = cast(dateadd(day, -7, getdate()) as [date]); declare @dateTo [date] = cast(dateadd(day, 28, getdate()) as [date]); declare @prTypeCode varchar = null; declare @ExcludeA [bit] = 0 ; declare @ExcludeB [bit] = 0;
;with distribution as ( select * from [schema1].[Table1] ), product as ( select * from [schema1].[Product] ), fint as ( select *, (case when CHARINDEX('0%', FIN_ CODE) > 0 then 1 else 0 end) as ZFlag from [schema1].[FinTab] ), deal as ( select *, case when (AG_ID = 5 or DE_ID = 6) then 1 else 0 end as Ex_flag from [P_ BASE1].[ schema2].[table3] ), dealersn as
( select distinct * from [P_ BASE1].[ schema2].[table4] ), regionN as ( select distinct * from [P_ BASE1].[ schema2].[table5] ), final as ( select
d.PRODUCT_CODE, p.PR_NAME, p.PR_TYPE_CODE, p.PR_ACTIVE, d.FIN_TABLE_CODE, ft.FT_NAME, ft.FT_ACTIVE, cast(d.SND_TO_DATE as [date]) as SND_TO_DATE, count(d.SN_ID) as SHOP_COUNT, min(ft.ZFlag) as ZFlag, min(ds.Ex_flag) as ExFlag, dn.SND_FULLNAME,rn.REG_NAME from distribution d left outer join product p on p.PRODUCT_CODE = d.PRODUCT_CODE left outer join fint ft on ft. FIN_ CODE = FIN_ CODE left outer join deal as ds On d.SN_ID = ds.SHOP_ID left outer join dealersn as dn on d.SN_ID = dn.SN_DATA_ID left outer join regionN as rn ON ds.REGION_ID = rn.REGION_ID where d.SND_TO_DATE between @dateFrom and @dateTo and (@prTypeCode is null or p.PR_TYPE_CODE = @prTypeCode) group by rn.REG_NAME, ds.REGION_ID, ds.SHOP_ID, d.PRODUCT_CODE, p.PR_NAME, p.PR_TYPE_CODE, p.PR_ACTIVE, d.FIN_TABLE_CODE, ft.FT_NAME, ft.FT_ACTIVE, d.SND_TO_DATE,dn.SND_FULLNAME ) IF (@ZeroPercent = 0 AND @LargeChainsOrTushev = 0) BEGIN SELECT DISTINCT * FROM final WHERE ZFlag = 0 AND ExFlag = 0 END ELSE IF @ZeroPercent = 1 AND @LargeChainsOrTushev = 0 BEGIN SELECT DISTINCT * FROM final WHERE ZFlag = 1 AND ExFlag = 0 END ELSE IF @ZeroPercent = 0 AND @LargeChainsOrTushev = 1 BEGIN SELECT DISTINCT * FROM final WHERE ZFlag = 0 AND ExFlag = 1 END ELSE BEGIN SELECT DISTINCT * FROM final END
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这段SQL代码是一个复杂的查询语句,它从多个表中提取数据并进行联接、筛选和分组,最终根据不同的条件返回结果。下面是对这个查询的逐步解析:
变量声明: 首先定义了几个变量,包括@dateFrom
(7天前的日期)、@dateTo
(28天后的日期)、@prTypeCode
(产品类型代码,默认为NULL)、@ExcludeA
和@ExcludeB
(布尔值,默认都为0)。
CTE (Common Table Expressions): 使用了多个CTE来简化复杂查询,每个CTE代表了一个子查询的结果集。
distribution
: 从[schema1].[Table1]
获取数据。product
: 从[schema1].[Product]
获取数据。fint
: 从[schema1].[FinTab]
获取数据,并添加一个计算列ZFlag
判断FIN_CODE
是否包含'0%'。deal
: 从[P_BASE1].[schema2].[table3]
获取数据,并添加一个标记列Ex_flag
判断是否满足特定条件(AG_ID = 5或DE_ID = 6)。dealersn
和 regionN
: 分别从相关表获取经销商和区域信息。Final CTE: 这是主要的数据处理部分,通过左连接上述CTE得到的数据,并进行了以下操作:
SND_TO_DATE
在指定日期范围内的记录。@prTypeCode
过滤产品类型。SHOP_COUNT
),并取ZFlag
和ExFlag
的最小值。条件分支: 最后,根据外部输入的参数@ZeroPercent
和@LargeChainsOrTushev
的值,决定从final
CTE中返回哪些数据。这些参数控制着是否排除含有'0%'的财务代码记录(ZFlag=1)以及是否只看大型连锁或特定标识的记录(ExFlag=1)。
应用到阿里云场景: 虽然这段SQL直接运行于数据库系统(如MySQL, SQL Server等),但如果你在使用阿里云的MaxCompute、AnalyticDB等大数据分析服务时,类似的逻辑可以应用于复杂数据分析任务。例如,你可以将这些查询逻辑用于销售数据分析、客户行为分析等场景,通过调整时间范围、产品分类等参数,快速生成不同维度的报表或洞察。
需要注意的是,阿里云MaxCompute等服务可能需要对SQL语法做适当调整,因为它们支持的SQL方言与传统关系型数据库略有差异。此外,利用阿里云DataWorks等数据开发工具,可以更方便地管理这类复杂查询任务,实现数据的自动化处理和分析。