定单号码 物料编号 物料名称 物料仓库位置
001     ac01    办公工具  a01-1
001     ac01    办公工具  a01-2
001     ac01    办公工具  a01-3
001     ac02    生活用品  b01-1
001     ac02    生活用品  b01-2
001     ac03    电子产品  b01-3
001     ac04    交通工具  c01-1
001     ac04    交通工具  c01-2
002     ac01    办公工具  a01-1
查询定单号为001中所有物料的库存位置!查询结果如下:
001     ac01    办公工具   a01-1,a01-2,a01-3
001     ac02    生活用品   b01-1,b01-2
001     ac03    电子产品   b01-3
001     ac04    交通工具   c01-1,c01-2

解决方案 »

  1.   

    --各种字符串分函数--3.3.1 使用游标法进行字符串合并处理的示例。
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3--合并处理
    --定义结果集表变量
    DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定义游标并进行合并处理
    DECLARE tb CURSOR LOCAL
    FOR
    SELECT col1,col2 FROM tb ORDER BY  col1,col2
    DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
    OPEN tb
    FETCH tb INTO @col1,@col2
    SELECT @col1_old=@col1,@s=''
    WHILE @@FETCH_STATUS=0
    BEGIN
    IF @col1=@col1_old
    SELECT @s=@s+','+CAST(@col2 as varchar)
    ELSE
    BEGIN
    INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
    SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
    END
    FETCH tb INTO @col1,@col2
    END
    INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
    CLOSE tb
    DEALLOCATE tb
    --显示结果并删除测试数据
    SELECT * FROM @t
    DROP TABLE tb
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    GO
    /*==============================================*/
    --3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3
    GO--合并处理函数
    CREATE FUNCTION dbo.f_str(@col1 varchar(10))
    RETURNS varchar(100)
    AS
    BEGIN
    DECLARE @re varchar(100)
    SET @re=''
    SELECT @re=@re+','+CAST(col2 as varchar)
    FROM tb
    WHERE col1=@col1
    RETURN(STUFF(@re,1,1,''))
    END
    GO--调用函数
    SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
    --删除测试
    DROP TABLE tb
    DROP FUNCTION f_str
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    GO/*==============================================*/
    --3.3.3 使用临时表实现字符串合并处理的示例
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3--合并处理
    SELECT col1,col2=CAST(col2 as varchar(100)) 
    INTO #t FROM tb
    ORDER BY col1,col2
    DECLARE @col1 varchar(10),@col2 varchar(100)
    UPDATE #t SET 
    @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
    @col1=col1,
    col2=@col2
    SELECT * FROM #t
    /*--更新处理后的临时表
    col1       col2
    ---------- -------------
    a          1
    a          1,2
    b          1
    b          1,2
    b          1,2,3
    --*/
    --得到最终结果
    SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
    /*--结果
    col1       col2
    ---------- -----------
    a          1,2
    b          1,2,3
    --*/
    --删除测试
    DROP TABLE tb,#t
    GO
    /*==============================================*/--3.3.4.1 每组 <=2 条记录的合并
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'c',3--合并处理
    SELECT col1,
    col2=CAST(MIN(col2) as varchar)
    +CASE 
    WHEN COUNT(*)=1 THEN ''
    ELSE ','+CAST(MAX(col2) as varchar)
    END
    FROM tb
    GROUP BY col1
    DROP TABLE tb
    /*--结果
    col1       col2      
    ---------- ----------
    a          1,2
    b          1,2
    c          3
    --*/--3.3.4.2 每组 <=3 条记录的合并
    --处理的数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',1
    UNION ALL SELECT 'a',2
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',2
    UNION ALL SELECT 'b',3
    UNION ALL SELECT 'c',3--合并处理
    SELECT col1,
    col2=CAST(MIN(col2) as varchar)
    +CASE 
    WHEN COUNT(*)=3 THEN ','
    +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
    ELSE ''
    END
    +CASE 
    WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
    ELSE ''
    END
    FROM tb a
    GROUP BY col1
    DROP TABLE tb
    /*--结果
    col1       col2
    ---------- ------------
    a          1,2
    b          1,2,3
    c          3
    --*/
    GO
      

  2.   

    --> 测试数据: #T
    if object_id('tempdb.dbo.T') is not null drop table T
    create table T (定单号码 varchar(3),物料编号 varchar(4),物料名称 nvarchar(8),物料仓库位置 varchar(5))
    insert into T
    select '001','ac01','办公工具','a01-1' union all
    select '001','ac01','办公工具','a01-2' union all
    select '001','ac01','办公工具','a01-3' union all
    select '001','ac02','生活用品','b01-1' union all
    select '001','ac02','生活用品','b01-2' union all
    select '001','ac03','电子产品','b01-3' union all
    select '001','ac04','交通工具','c01-1' union all
    select '001','ac04','交通工具','c01-2' union all
    select '002','ac01','办公工具','a01-1'
    go
    --合并处理函数
    CREATE FUNCTION dbo.f_str(@定单号码 varchar(3),@物料编号 varchar(4),@物料名称 nvarchar(8))
    RETURNS varchar(100)
    AS
    BEGIN
    DECLARE @re varchar(100)
    SET @re=''
    SELECT @re=@re+','+物料仓库位置
    FROM T
    WHERE 定单号码=@定单号码 and 物料编号=@物料编号 and 物料名称=@物料名称
    RETURN(STUFF(@re,1,1,''))
    END
    GOselect 定单号码,物料编号,物料名称,dbo.f_str(定单号码,物料编号,物料名称) as 仓库位置
    from T
    where 定单号码='001'
    group by 定单号码,物料编号,物料名称drop function f_str/*
    定单号码 物料编号 物料名称     仓库位置
    ---- ---- -------- ----------------------------------------------------------------------------------------------------
    001  ac01 办公工具     a01-1,a01-2,a01-3
    001  ac02 生活用品     b01-1,b01-2
    001  ac03 电子产品     b01-3
    001  ac04 交通工具     c01-1,c01-2(4 行受影响)
    */
      

  3.   

    -- create table data(
    -- 定单号码 char(4),
    -- 物料编号 char(4),
    -- 物料名称 char(8),
    -- 物料仓库位置 char(6))
    -- insert into data
    -- values ('0001','ac01','办公工具','a01-3')
    -- select * from data
    select * from data 
    where 定单号码='0001' 
    group by 定单号码,物料编号,物料名称,物料仓库位置
    order by 定单号码,物料编号