a表id  yhname
1   优惠1
2   优惠2
3   优惠3
4   优惠4
5   优惠n
B表nid  yhcontent
1    优惠1,优惠2
2    优惠1,优惠4
3    优惠2,优惠3请问我想得出以下结果
B表中含有优惠1,优惠2,优惠n的个数

解决方案 »

  1.   

    想问楼主:
    B表中的yhcontent怎么知道该填那种优惠?
      

  2.   

    --各种字符串分函数if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GO
    select * from f_splitSTR('a,b,c',',')
    --3.2.1 循环截取法
    CREATE FUNCTION f_splitSTR(
    @s   varchar(8000),   --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(col varchar(100))
    AS
    BEGIN
    DECLARE @splitlen int
    SET @splitlen=LEN(@split+'a')-2
    WHILE CHARINDEX(@split,@s)>0
    BEGIN
    INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
    SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
    END
    INSERT @re VALUES(@s)
    RETURN
    END
    GO
    /*==============================================*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GO--3.2.3.1 使用临时性分拆辅助表法
    CREATE FUNCTION f_splitSTR(
    @s   varchar(8000),  --待分拆的字符串
    @split varchar(10)     --数据分隔符
    )RETURNS @re TABLE(col varchar(100))
    AS
    BEGIN
    --创建分拆处理的辅助表(用户定义函数中只能操作表变量)
    DECLARE @t TABLE(ID int IDENTITY,b bit)
    INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b INSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)
    FROM @t
    WHERE ID<=LEN(@s+'a') 
    AND CHARINDEX(@split,@split+@s,ID)=ID
    RETURN
    END
    GO
    select * from dbo.f_splitSTR('10.10.11','.')
    /*==============================================*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tb_splitSTR]') and objectproperty(id,N'IsUserTable')=1)
    drop table [dbo].[tb_splitSTR]
    GO--3.2.3.2 使用永久性分拆辅助表法
    --字符串分拆辅助表
    SELECT TOP 8000 ID=IDENTITY(int,1,1) INTO dbo.tb_splitSTR
    FROM syscolumns a,syscolumns b
    GO--字符串分拆处理函数CREATE FUNCTION f_splitSTR(
    @s     varchar(8000),  --待分拆的字符串
    @split  varchar(10)     --数据分隔符
    )RETURNS TABLE
    AS
    RETURN(
    SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as varchar(100))
    FROM tb_splitSTR
    WHERE ID<=LEN(@s+'a') 
    AND CHARINDEX(@split,@split+@s,ID)=ID)
    GO返回B表后连接求sum
      

  3.   

    B表中的yhcontent的优惠是直接从A表取的
      

  4.   

    create table tb1(id int,yhname varchar(50))
    insert tb1 values(1 ,      '优惠1') 
    insert tb1 values(2 ,      '优惠2') 
    insert tb1 values(3 ,      '优惠3') 
    insert tb1 values(4 ,      '优惠4') 
    insert tb1 values(5 ,      '优惠n')create table tb2(nid int,yhcontent varchar(50))
    insert tb2 values(1 ,        '优惠1,优惠2') 
    insert tb2 values(2 ,        '优惠1,优惠4') 
    insert tb2 values(3 ,        '优惠2,优惠3')select a.id,a.yhname,sum(case when charindex(a.yhname,b.yhcontent)>0 then 1 else 0 end) num
    from tb1 a left join tb2 b
     on charindex(a.yhname,b.yhcontent)>0
    group by a.id,a.yhnamedrop table tb1,tb2/*
    id          yhname                                             num         
    ----------- -------------------------------------------------- ----------- 
    1           优惠1                                                2
    2           优惠2                                                2
    3           优惠3                                                1
    4           优惠4                                                1
    5           优惠n                                                0(所影响的行数为 5 行)*/
      

  5.   

    解决了,请结帖
    结帖方式 :管理帖子->给分->输入密码->结帖谢谢.