SqlServer Cross Apply和Outer Apply用法

23426 人阅读
分类:

如果我们表数据如下

1.PNG

行业字段会有多个,中间用逗号隔开,现在想要查询出如下结果

2.PNG

很明显,每个行业都被解析出来,并汇总行业个数,总人数,这时候使用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)



和博主交个朋友吧
    发布篇幅
    • 文章总数:0
    • 原创:0
    • 转载:0
    • 译文:0
    文章分类
      文章存档
      阅读排行