select Customer,Adress,Person,BillNo from v_getCustomer Where 1=1 + @Where 
其中:
v_getCustomer 是一个视图
BillNo爲一个非空唯一的字段
@Where爲動態的查詢條件,通過代碼傳遞過來。
例如  
Customer   BillNo Person Address
A公司   发票编号1 王小姐   地址A
A公司 发票编号2 李先生   地址A
A公司 发票编号3 王小姐   地址A
A公司 发票编号4 陆先生   地址AB公司 发票编号5 赵先生    地址B
B公司 发票编号6 李小姐    地址B
现在需要处理数据
同一公司的数据合併爲一条数据 
例:
Customer Address Person
A公司 地址A 王小姐 /李先生/陆先生 
B公司 地址B    赵先生/李小姐
一个Customer 可能有多条记录,但是 Customer,Address相同,不会发生改变,BillNo唯一就是说。同一公司,地址保留一个,联系人合併,用/分隔,如爲同一个人,则显示一个.
例如例子中: 
 A公司有4条记录,但组合成一条记录,其中Customer保留1个,Address保留一个,Person组合起来,用/分隔,但是有两个王小姐,所以保留一个王小姐数据库是SQL2000请问,应怎样通过存储过程获取所需要格式地数据?

解决方案 »

  1.   


    select Customer,Adress,Person,BillNo from v_getCustomer  Where 1=1 + @Where  其中:
    v_getCustomer 是一个视图
    BillNo爲一个非空唯一的字段
    @Where爲动态的查询条件,通过代码传递过来。
    例如  
    Customer   BillNo Person Address
    A公司   发票编号1 王小姐   地址A
    A公司 发票编号2 李先生   地址A
    A公司 发票编号3 王小姐   地址A
    A公司 发票编号4 陆先生   地址AB公司 发票编号5 赵先生    地址B
    B公司 发票编号6 李小姐    地址B
    现在需要处理数据
    同一公司的数据合併爲一条数据 
    例:
    Customer Address Person
    A公司 地址A 王小姐 /李先生/陆先生 
    B公司 地址B    赵先生/李小姐
    一个Customer 可能有多条记录,但是 Customer,Address相同,不会发生改变,BillNo唯一就是说。同一公司,地址保留一个,联系人合併,用/分隔,如爲同一个人,则显示一个.
    例如例子中: 
     A公司有4条记录,但组合成一条记录,其中Customer保留1个,Address保留一个,Person组合起来,用/分隔,但是有两个王小姐,所以保留一个王小姐数据库是SQL2000请问,应怎样通过存储过程获取所需要格式地数据?
      

  2.   

    函数里面不能动态拼接,存储过程中可以declare @Where varchar(200) set @Where ='and BillNo >100'
    declare @sql varchar(8000) set @sql=''
    set @sql='select Customer,Adress,Person,BillNo 
    from v_getCustomer Where 1=1 '+ @Where
    exec(@sql)  
      

  3.   

    CREATE FUNCTION dbo.f_str(@Customer varchar(100),@Address varchar(100))
    RETURNS varchar(8000)
    AS
    BEGIN
      DECLARE @r varchar(8000)
      SET @r = ''
      SELECT @r = @r + ',' + Person FROM ls WHERE Customer=@Customer and Address=@Address
      RETURN STUFF(@r, 1, 1, '')
    ENDgocreate  Proc CreategetCustomer
    @where   varchar(1000)
    AS
    Begin
    declare @sql varchar(1000)
    set @sql='select Customer,Address,Person into ls from v_getCustomer where 1=1 '
                    +@where+' group by Customer,Address,Person' 
    exec(@sql)
    select Customer,Address,dbo.f_str(Customer,Address) from ls
    drop table lsendgoexec CreategetCustomer 'and BillNo>=发票编号1'
      

  4.   


    豆子,你好,謝謝你的回答
    不過好象還有些問題。現在需要是同一個公司只出現一條記錄,但是按照你提供的方法
    同一個公司會出現多條記錄,請問,這應該怎樣解決
    AMD USA Sid
    Mis USA Bill,Jone
    Mis USA Bill,Jone
      

  5.   

    另外,還需要增加BillNo在查詢語句中。
    因爲它需要作爲主鍵
      

  6.   


    5樓和6樓的問題已經解決了,但是又發現一個問題
    Mis USA Bill,Jone,Bill 1
    如果存在相同的記錄,就無法去除重複了。。
    BillNo   Cuntomer   Adress  Person
    1         MIS        BJ        Bill
    2         MIS        BJ        Bill
     
      

  7.   


    这个要求有问题哟,既然都按公司和地址分组了,BillNo又怎么唯一啊,还怎么查询呢?
      

  8.   

    BillNo可以取最小的那個 Min(BillNo)
      

  9.   

    去重复主要是你要在存储过程的查询语句中
    select Customer,Address,dbo.f_str(Customer,Address) from ls
    改为
    select Customer,Address,dbo.f_str(Customer,Address) from ls group by Customer,Address
      

  10.   

    我用你给的数据结合前面写的函数,已测试通过if object_id('v_getCustomer') is not null
    drop table v_getCustomer;
    go
    create table v_getCustomer
    (
    BillNo int not null primary key,
    Customer nvarchar(25) not null,
    Address nvarchar(100) not null,
    Person nvarchar(25) not null
    )insert into v_getCustomer
    select 1, 'A公司', '地址A', '王小姐' union all
    select 2, 'A公司', '地址A', '李先生' union all
    select 3, 'A公司', '地址A', '王小姐' union all
    select 4, 'A公司', '地址A', '陆先生' union all
    select 5, 'B公司', '地址B', '赵先生' union all
    select 6, 'B公司', '地址B', '李小姐'
    goalter function dbo.f_str(@Customer varchar(100),@Address varchar(100))
    returns varchar(8000)
    as
    begin
      declare @r varchar(8000)
      set @r = ''  select @r = @r + '/' + Person 
      from v_getCustomer 
      where Customer = @Customer 
    and Address = @Address  return STUFF(@r, 1, 1, '')
    end
    go
    alter  proc CreategetCustomer
    @where   varchar(1000)
    AS
    Begin
        declare @sql varchar(1000)
        set @sql='select min(BillNo) as BillNo, Customer,Address,Person into ls from v_getCustomer where 1=1 '
                    +@where+' group by Customer,Address,Person' 
        exec(@sql)    
        select min(BillNo) as BillNo, Customer,Address,dbo.f_str(Customer,Address) as Persons from ls group by Customer, Address
        drop table lsend
    goexec CreategetCustomer ''
    /*
    结果
    (5 行受影响)
    BillNo      Customer                  Address           Persons
    ----------- ------------------------- -------- --------------------------------------1           A公司                       地址A           王小姐/李先生/王小姐/陆先生
    5           B公司                       地址B           赵先生/李小姐
    */
      

  11.   

    已經解決了
    謝謝豆子和bala7229291