code name phone
aa 张三 132000000
aa 李四 133000000
bb 王五 122000000
bb 照六 144000000
bb 无七 155000000结果:code name1 phone1 name2 phone2  name3 phone 3  ...
aa 张三 132000000 李四 133000000               ...
bb 王五 122000000 照六 144000000 无七 155000000  ...
 
有多少条记录就在后面接上多少条!怎么写存储过程,在线等~~,急··

解决方案 »

  1.   

    如果你后台的 name1 phone1 ... 是一个字段的内容,用 group_concat() 就可以了,要写成存储过程你就自己加到 begin end 里吧:select code, group_concat(name, ' ', phone separator ' ')
    from 表
    grop by code
    要是多个字段的话,这个还真不知道怎么弄。
      

  2.   

    if object_id('tempdb.dbo.#tb') is not null drop table #tb
    go
    create table #tb (code varchar(2),name varchar(4),phone int)
    insert into #tb
    select 'aa','张三',132000000 union all
    select 'aa','李四',133000000 union all
    select 'bb','王五',122000000 union all
    select 'bb','照六',144000000 union all
    select 'bb','无七',155000000alter table #tb add id int identity(1,1)select *,n=(select count(*) from #tb where code=t.code and id<=t.id)
    into #t
    from #tb tselect code,
        name1=max(case when n=1 then name end),
        phone1=max(case when n=1 then phone end),
        name2=max(case when n=2 then name end),    
        phone2=max(case when n=2 then phone end) 
    from #t  
    group by code 
    code name1 phone1      name2 phone2
    ---- ----- ----------- ----- -----------
    aa   张三    132000000   李四    133000000
    bb   王五    122000000   照六    144000000
    我查到这个答案,可以只能固定显示2个字段,我想不固定字段,可以有多少就显示多少~~
      

  3.   


    参考下贴中的动态方法
    http://blog.csdn.net/acmain_chm/article/details/4283943
      

  4.   

    DELIMITER $$
    DROP PROCEDURE IF EXISTS dtcoltorow$$
    CREATE PROCEDURE dtcoltorow()
    BEGIN
    DECLARE i INT DEFAULT 1;
    SET @asql='';
    SELECT MAX(bz) INTO @bz FROM (
    SELECT a.`ID`,a.`code`,a.`name`,a.`phone`,COUNT(b.id) AS bz FROM ttl2 a LEFT JOIN ttl2 b
    ON a.`code`=b.`code` AND a.`ID`>=b.`ID` GROUP BY a.`ID`,a.`code`,a.`name`,a.`phone`) a;
    SET @asql1='(
    SELECT a.`ID`,a.`code`,a.`name`,a.`phone`,COUNT(b.id) AS bz FROM ttl2 a LEFT JOIN ttl2 b
     ON a.`code`=b.`code` AND a.`ID`>=b.`ID` GROUP BY a.`ID`,a.`code`,a.`name`,a.`phone`) a1';
    WHILE i<=@bz DO
    SET @asql=CONCAT(@asql,'max(if(bz=',i,',name,"")) as name',i,',','max(if(bz=',i,',phone,"")) as phone',i,',');
    SET i=i+1;
    END WHILE;
    SET @asql=CONCAT('select `code` ,',LEFT(@asql,LENGTH(@asql)-1),' from ',@asql1,' group by `code` ');
    SELECT @asql;
    PREPARE stml FROM @asql;
    EXECUTE stml;
    END$$
    DELIMITER ;CALL dtcoltorow;
      

  5.   

    DELIMITER $$
    DROP PROCEDURE IF EXISTS dtcoltorow$$
    CREATE PROCEDURE dtcoltorow()
    BEGIN
    DECLARE i INT DEFAULT 1;
    SET @asql='';
    SELECT MAX(bz) INTO @bz FROM (
    SELECT a.`ID`,a.`code`,a.`name`,a.`phone`,COUNT(b.id) AS bz FROM ttl2 a LEFT JOIN ttl2 b
    ON a.`code`=b.`code` AND a.`ID`>=b.`ID` GROUP BY a.`ID`,a.`code`,a.`name`,a.`phone`) a;
    SET @asql1='(
    SELECT a.`ID`,a.`code`,a.`name`,a.`phone`,COUNT(b.id) AS bz FROM ttl2 a LEFT JOIN ttl2 b
     ON a.`code`=b.`code` AND a.`ID`>=b.`ID` GROUP BY a.`ID`,a.`code`,a.`name`,a.`phone`) a1';
    WHILE i<=@bz DO
    SET @asql=CONCAT(@asql,'max(if(bz=',i,',name,"")) as name',i,',','max(if(bz=',i,',phone,"")) as phone',i,',');
    SET i=i+1;
    END WHILE;
    SET @asql=CONCAT('select `code` ,',LEFT(@asql,LENGTH(@asql)-1),' from ',@asql1,' group by `code` ');
    SELECT @asql;
    PREPARE stml FROM @asql;
    EXECUTE stml;
    END$$
    DELIMITER ;CALL dtcoltorow;
      

  6.   

    请最好在这个基础上修改,其他的我都改不了,谢谢了
    if object_id('tempdb.dbo.#tb') is not null drop table #tb
    go
    create table #tb (code varchar(2),name varchar(4),phone int)
    insert into #tb
    select 'aa','张三',132000000 union all
    select 'aa','李四',133000000 union all
    select 'bb','王五',122000000 union all
    select 'bb','照六',144000000 union all
    select 'bb','无七',155000000alter table #tb add id int identity(1,1)select *,n=(select count(*) from #tb where code=t.code and id<=t.id)
    into #t
    from #tb tselect code,
      name1=max(case when n=1 then name end),
      phone1=max(case when n=1 then phone end),
      name2=max(case when n=2 then name end),   
      phone2=max(case when n=2 then phone end)  
    from #t   
    group by code  
    code name1 phone1 name2 phone2
    ---- ----- ----------- ----- -----------
    aa 张三 132000000 李四 133000000
    bb 王五 122000000 照六 144000000
      

  7.   

      wwwa,您能不能把字段和表名开始标识好,我看不懂,比如bz是什么?
      

  8.   

    假设你使用MYSQL,加入自增字段ID
    SELECT a.`ID`,a.`code`,a.`name`,a.`phone`,COUNT(b.id) AS bz FROM ttl2 a LEFT JOIN ttl2 b
    ON a.`code`=b.`code` AND a.`ID`>=b.`ID` GROUP BY a.`ID`,a.`code`,a.`name`,a.`phone`看看结果自己动手做一下吧
      

  9.   

    wwwwa,大哥,我那个这样写,
    begin
    declare i int default 1;
    set @asql='';
    select max(rowcount) into @rowcount from ( select pm1.id,pm1.boarId,pm1.sowId,pm1.matchingDate,pm1.matchingType,count(pm2.id) as rowcount from pig_matching pm1 left join pig_matching pm2 on pm1.boarId=pm2.boarId and pm1.id>=pm2.id group by pm1.id,pm1.boarId,pm1.sowId,pm1.matchingDate,pm1.matchingType) a; set @asql1='(
       select pm1.id,pm1.boarId,pm1.sowId,pm1.matchingDate,pm1.matchingType,count(pm2.id) as rowcount from pig_matching pm1 left join pig_matching pm2 on pm1.boarId=pm2.boarId and pm1.id>=pm2.id group by pm1.id,pm1.boarId,pm1.sowId,pm1.matchingDate,pm1.matchingType
    ) a1'; while i<=@rowcount do
    set @aspl=concat(@asql,'max(if(rowcount=',i,',sowId,"")) as sowId',i,',','max(if(rowcount=',i,',matchingDate,"")) as  matchingDate',i,',','max(if(rowcount=',i,',matchingType,"")) as matchingType',i,',' );
    set i=i+1;
    end while; set @asql=concat('select boarId',left (@asql,length(@asql)-1),' from ',@asql1,' group by boarId ' );
    select @asql; prepare matching from @asql;
    execute matching;
    end可是,运行后只是一个字段@asql,值就是代码,再运行里面的代码值,只得到一列!
      

  10.   

    @asql内容是什么,在MYSQL中运行,结果是什么
      

  11.   

    select boarId  from (
       select pm1.id,pm1.boarId,pm1.sowId,pm1.matchingDate,pm1.matchingType,count(pm2.id) as rowcount from pig_matching pm1 left join pig_matching pm2 on pm1.boarId=pm2.boarId and pm1.id>=pm2.id group by pm1.id,pm1.boarId,pm1.sowId,pm1.matchingDate,pm1.matchingType
    ) a1 group by boarId 这是@asql的内容,运行的结果
    +--------+
    | boarId |
    +--------+
    |    312 |
    |    321 |
    |    326 |
    |    330 |
    |    334 |
    |    335 |
    +--------+
    6 rows in set
     这是原表,在这个表基础上查
    +--------+-------+--------------+---------------------+
    | boarid | sowid | matchingtype | matchingdate        |
    +--------+-------+--------------+---------------------+
    |    312 |   311 |            2 | 2011-08-25 00:00:00 |
    |    321 |   308 |            1 | 2011-08-05 00:00:00 |
    |    326 |   311 |            1 | 2011-06-06 00:00:00 |
    |    330 |   308 |            1 | 2011-08-03 00:00:00 |
    |    330 |   308 |            1 | 2011-05-05 00:00:00 |
    |    330 |   311 |            1 | 2011-06-14 00:00:00 |
    |    334 |   311 |            1 | 2011-08-11 00:00:00 |
    |    335 |   308 |            1 | 2011-08-17 00:00:00 |
    |    330 |   308 |            1 | 2011-09-01 00:00:00 |
    +--------+-------+--------------+---------------------+
    9 rows in set
      

  12.   

    set @asql=concat(@asql,'max(if(rowcount=',i,',sowId,"")) as sowId',i,',','max(if(rowcount=',i,',matchingDate,"")) as matchingDate',i,',','max(if(rowcount=',i,',matchingType,"")) as matchingType',i,',' );
      

  13.   

    我是这样写的,现在有两个问题,第一那个循环好像没起作用,还有就是最后运行还是一个字段值为语句!begin
    declare i int default 1;
    set @asql='';
    select max(rowcount) into @rowcount from ( select pm1.id,pm1.boarId,pm1.sowId,pm1.matchingDate,pm1.matchingType,count(pm2.id) as rowcount from pig_matching pm1 left join pig_matching pm2 on pm1.boarId=pm2.boarId and pm1.id>=pm2.id group by pm1.id,pm1.boarId,pm1.sowId,pm1.matchingDate,pm1.matchingType) a; set @asql1='(
       select pm1.id,pm1.boarId,pm1.sowId,pm1.matchingDate,pm1.matchingType,count(pm2.id) as rowcount from pig_matching pm1 left join pig_matching pm2 on pm1.boarId=pm2.boarId and pm1.id>=pm2.id group by pm1.id,pm1.boarId,pm1.sowId,pm1.matchingDate,pm1.matchingType
    ) a1'; while i<=@rowcount do
    set @aspl=concat(@asql,'max(if(rowcount=',i,',sowId,"")) as sowId',i,',','max(if(rowcount=',i,',matchingDate,"")) as  matchingDate',i,',','max(if(rowcount=',i,',matchingType,"")) as matchingType',i,','  );
    set i=i+1;
    end while; set @asql=concat('select boarId,(select `group` from piginfor where id=boarId) as `group` ',left (@asql,length(@asql )-1),' from ',@asql1,' group by boarId ' );
    select @asql; prepare matching from @asql;
    execute matching;
    end
      

  14.   

    非常感谢你,终于可以了!我把那个select @asql 去掉就好!