SqlServer Cross Apply和Outer Apply用法
2017-08-05 15:16
23426 人阅读

如果我们表数据如下
行业字段会有多个,中间用逗号隔开,现在想要查询出如下结果
很明显,每个行业都被解析出来,并汇总行业个数,总人数,这时候使用Cross Apply将很容易达到效果
1.模拟上面一张表
Declare @tb Table ( LABEL_TEXT nvarchar(100), MEMBER_COUNT int ) Insert into @tb(LABEL_TEXT,MEMBER_COUNT) Values('淘宝',100), ('淘宝,淘宝王',200), ('购物,天猫,淘宝',300), ('衣服,淘宝,网购',400), ('天猫,网购',500) Select LABEL_TEXT 行业,MEMBER_COUNT 总人数 from @tb
2. 编写一个表值函数,返回表数据(拆分行业)
CREATE function [dbo].[UDF_SplitString] ( @Input nvarchar(max), @Separator nvarchar(max)=',' ) returns @TABLE table ( [LABEL_TEXT_AFTER_SPLIT] nvarchar(max) ) as begin declare @Index int, @Entry nvarchar(max) --返回@Separator在@Input中出现的开始位置 set @Index = charindex(@Separator,@Input) while (@Index > 0) begin set @Entry = ltrim(rtrim(substring(@Input, 1, @Index - 1))) insert into @TABLE([LABEL_TEXT_AFTER_SPLIT]) Values(@Entry) set @Input = substring(@Input, @Index + datalength(@Separator)/2, len(@Input)) --重新获取@Separator在@Input中出现的开始位置 set @Index = charindex(@Separator, @Input) end set @Entry = ltrim(rtrim(@Input)) insert into @TABLE([LABEL_TEXT_AFTER_SPLIT]) Values(@Entry) return end
3. 使用Cross Apply得到结果
SELECT LABEL_TEXT_AFTER_SPLIT 行业,Count(*) 行业个数,SUM(MEMBER_COUNT) 总人数 FROM @tb AS A Cross Apply dbo.UDF_SplitString(A.LABEL_TEXT,',') Group By LABEL_TEXT_AFTER_SPLIT
Cross Apply: 会将左边表数据逐行代入到右边进行计算(这里就是拆分行业),当右边为Null时,则不会显示(类似Inner Join)
Outer Apply:和Cross Apply的区别就是不管右边有没有数据就会显示(类似Left Join)
和博主交个朋友吧
