开发者社区 问答 正文

SQL Server代码中“ IF”之前的未定义错误

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

展开
收起
yb6moqbctxml4 2019-12-01 09:14:04 820 分享 版权
阿里云 AI 助理回答

这段SQL代码是一个复杂的查询语句,它从多个表中提取数据并进行联接、筛选和分组,最终根据不同的条件返回结果。下面是对这个查询的逐步解析:

  1. 变量声明: 首先定义了几个变量,包括@dateFrom(7天前的日期)、@dateTo(28天后的日期)、@prTypeCode(产品类型代码,默认为NULL)、@ExcludeA@ExcludeB(布尔值,默认都为0)。

  2. 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)。
    • dealersnregionN: 分别从相关表获取经销商和区域信息。
  3. Final CTE: 这是主要的数据处理部分,通过左连接上述CTE得到的数据,并进行了以下操作:

    • 筛选SND_TO_DATE在指定日期范围内的记录。
    • 根据@prTypeCode过滤产品类型。
    • 计算每个产品的店铺数量(SHOP_COUNT),并取ZFlagExFlag的最小值。
    • 选择一系列列作为输出字段。
  4. 条件分支: 最后,根据外部输入的参数@ZeroPercent@LargeChainsOrTushev的值,决定从final CTE中返回哪些数据。这些参数控制着是否排除含有'0%'的财务代码记录(ZFlag=1)以及是否只看大型连锁或特定标识的记录(ExFlag=1)。

应用到阿里云场景: 虽然这段SQL直接运行于数据库系统(如MySQL, SQL Server等),但如果你在使用阿里云的MaxCompute、AnalyticDB等大数据分析服务时,类似的逻辑可以应用于复杂数据分析任务。例如,你可以将这些查询逻辑用于销售数据分析、客户行为分析等场景,通过调整时间范围、产品分类等参数,快速生成不同维度的报表或洞察。

需要注意的是,阿里云MaxCompute等服务可能需要对SQL语法做适当调整,因为它们支持的SQL方言与传统关系型数据库略有差异。此外,利用阿里云DataWorks等数据开发工具,可以更方便地管理这类复杂查询任务,实现数据的自动化处理和分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答