数据表是这样的
GC   MODEL                          STATUS
---- ------------------------------ ------
GSM  SGH-T108+                      Z
CDMA DVD-P248A                      H
CDMA STW-CG72                       C
CDMA STW-CG72                       H
CDMA N70                            A
GSM  SGH-T108+                      Z
GSM  SGH-T108+                      Z
GSM  SGH-T108+                      G我怎么查出这样的结果
GC  MODEL      A   B   C  D  E  F   G  H  Z 
GSM SGH-T108+  0                          2
CDMA N70       A    ..........谢谢了

解决方案 »

  1.   

    /*
    普通行列转换
    (爱新觉罗.毓华 2007-11-18于海南三亚)假设有张学生成绩表(tb)如下:
    Name Subject Result
    张三 语文  74
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94
    */-------------------------------------------------------------------------
    /*
    想变成 
    姓名         语文        数学        物理          
    ---------- ----------- ----------- ----------- 
    李四         74          84          94
    张三         74          83          93
    */create table tb
    (
       Name    varchar(10) ,
       Subject varchar(10) ,
       Result  int
    )insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
    insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
    insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
    insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
    insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
    insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
    go--静态SQL,指subject只有语文、数学、物理这三门课程。
    select name 姓名,
      max(case subject when '语文' then result else 0 end) 语文,
      max(case subject when '数学' then result else 0 end) 数学,
      max(case subject when '物理' then result else 0 end) 物理
    from tb
    group by name
    /*
    姓名         语文        数学        物理          
    ---------- ----------- ----------- ----------- 
    李四         74          84          94
    张三         74          83          93
    */--动态SQL,指subject不止语文、数学、物理这三门课程。
    declare @sql varchar(8000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
    from (select distinct Subject from tb) as a
    set @sql = @sql + ' from tb group by name'
    exec(@sql) 
    /*
    姓名         数学        物理        语文          
    ---------- ----------- ----------- ----------- 
    李四         84          94          74
    张三         83          93          74
    */-------------------------------------------------------------------
    /*加个平均分,总分
    姓名         语文        数学        物理        平均分                总分          
    ---------- ----------- ----------- ----------- -------------------- ----------- 
    李四         74          84          94          84.00                252
    张三         74          83          93          83.33                250
    */--静态SQL,指subject只有语文、数学、物理这三门课程。
    select name 姓名,
      max(case subject when '语文' then result else 0 end) 语文,
      max(case subject when '数学' then result else 0 end) 数学,
      max(case subject when '物理' then result else 0 end) 物理,
      cast(avg(result*1.0) as decimal(18,2)) 平均分,
      sum(result) 总分
    from tb
    group by name
    /*
    姓名         语文        数学        物理        平均分                总分          
    ---------- ----------- ----------- ----------- -------------------- ----------- 
    李四         74          84          94          84.00                252
    张三         74          83          93          83.33                250
    */--动态SQL,指subject不止语文、数学、物理这三门课程。
    declare @sql1 varchar(8000)
    set @sql1 = 'select Name as ' + '姓名'
    select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
    from (select distinct Subject from tb) as a
    set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
    exec(@sql1) 
    /*
    姓名         数学        物理        语文        平均分                总分          
    ---------- ----------- ----------- ----------- -------------------- ----------- 
    李四         84          94          74          84.00                252
    张三         83          93          74          83.33                250
    */drop table tb    ---------------------------------------------------------
    ---------------------------------------------------------
    /*
    如果上述两表互相换一下:即姓名 语文 数学 物理
    张三 74  83  93
    李四 74  84  94想变成 
    Name       Subject Result      
    ---------- ------- ----------- 
    李四         语文      74
    李四         数学      84
    李四         物理      94
    张三         语文      74
    张三         数学      83
    张三         物理      93
    */create table tb1
    (
       姓名 varchar(10) ,
       语文 int ,
       数学 int ,
       物理 int
    )insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
    insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)select * from
    (
      select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
      union all
      select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
      union all
      select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
    ) t
    order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end--------------------------------------------------------------------
    /*加个平均分,总分
    Name       Subject     Result               
    ---------- -------    -------------------- 
    李四         语文      74.00
    李四         数学      84.00
    李四         物理      94.00
    李四         平均分    84.00
    李四         总分      252.00
    张三         语文      74.00
    张三         数学      83.00
    张三         物理      93.00
    张三         平均分    83.33
    张三         总分      250.00
    */select * from
    (
      select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
      union all
      select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
      union all
      select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
      union all
      select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
      union all
      select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
    ) t
    order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 enddrop table tb1
      

  2.   

    /* 将表数据旋转90度(2007-11-19于海南三亚) 将下表数据: A b c d e -------------------- ----------- ----------- ----------- ----------- x 1 2 3 4 y 5 6 7 8 z 9 10 11 12 转化成如下结果: a x y z -------------------- ---------- ---------- ---------- b 1 5 9 c 2 6 10 d 3 7 11 e 4 8 12 */ --生成测试数据 create table test1(A varchar(20),b int,c int,d int,e int) insert into test1 select 'x',1,2 ,3 ,4 insert into test1 select 'y',5,6 ,7 ,8 insert into test1 select 'z',9,10,11,12 go --生成中间数据表 declare @s varchar(8000) set @s = 'create table test2(a varchar(20)' select @s = @s + ',' + A + ' varchar(10)' from test1 set @s = @s + ')' exec(@s) print @s --借助中间表实现行列转换 declare @name varchar(20) declare t_cursor cursor for select name from syscolumns where id=object_id('test1') and colid > 1 order by colid open t_cursor fetch next from t_cursor into @name while @@fetch_status = 0 begin  exec('select ' + @name + ' as t into test3 from test1') set @s='insert into test2 select ''' + @name + ''''  select @s = @s + ',''' + rtrim(t) + '''' from test3 exec(@s) exec('drop table test3') fetch next from t_cursor into @name end close t_cursor deallocate t_cursor --查看行列互换处理结果 select * from test1 select * from test2 --删除表 drop table test1 drop table test2 ---------------------------------------------------------------------------- /*固定的写法:*/ select t1.* , t2.y , t3.z from (select a = 'b' , x = b from test1 where a = 'x') t1, (select a = 'b' , y = b from test1 where a = 'y') t2, (select a = 'b' , z = b from test1 where a = 'z') t3 where t1.a = t2.a and t1.a = t2.a union all select t1.* , t2.y , t3.z from (select a = 'c' , x = c from test1 where a = 'x') t1, (select a = 'c' , y = c from test1 where a = 'y') t2, (select a = 'c' , z = c from test1 where a = 'z') t3 where t1.a = t2.a and t1.a = t2.a union all select t1.* , t2.y , t3.z from (select a = 'd' , x = d from test1 where a = 'x') t1, (select a = 'd' , y = d from test1 where a = 'y') t2, (select a = 'd' , z = d from test1 where a = 'z') t3 where t1.a = t2.a and t1.a = t2.a union all select t1.* , t2.y , t3.z from (select a = 'e' , x = e from test1 where a = 'x') t1, (select a = 'e' , y = e from test1 where a = 'y') t2, (select a = 'e' , z = e from test1 where a = 'z') t3 where t1.a = t2.a and t1.a = t2.a ---------------------------------------------------------------------------- /* 表tb,数据如下: 项目种类 业绩 提成洗吹类  200 10 外卖 100 5 合计 300 15 转换成: 项目种类 洗吹类 外卖 合计业绩 200 100 300 提成 10 5 15 */ create table tb ( 项目种类 varchar(10), 业绩 int, 提成 int ) insert into tb(项目种类,业绩,提成) values('洗吹类',200,10) insert into tb(项目种类,业绩,提成) values('外卖' ,100,5) insert into tb(项目种类,业绩,提成) values('合计' ,300,15) go select 项目种类,sum(洗吹类) as 洗吹类 , sum(外卖) as 外卖 , sum(合计) as 合计 from ( select 项目种类 = '业绩', 洗吹类 = case when 项目种类 = '洗吹类' then 业绩 else 0 end, 外卖 = case when 项目种类 = '外卖' then 业绩 else 0 end, 合计 = case when 项目种类 = '合计' then 业绩 else 0 end  from tb union all  select 项目种类 = '提成' , 洗吹类 = case when 项目种类 = '洗吹类' then 提成 else 0 end, 外卖 = case when 项目种类 = '外卖' then 提成 else 0 end, 合计 = case when 项目种类 = '合计' then 提成 else 0 end  from tb ) m group by 项目种类 order by 项目种类 desc drop table tb /* 项目种类 洗吹类 外卖 合计 -------- ----------- ----------- ----------- 业绩 200 100 300 提成 10 5 15 (所影响的行数为 2 行) */ -------------------------------------------------------------------------- /* 数据库中tb表格如下 月份 工资 福利 奖金 1月 100 200 300 2月 110 210 310 3月 120 220 320 4月 130 230 330 我想得到的结果是 项目 1月 2月 3月 4月工资 100 110 120 130 福利 200 210 220 230 奖金 300 310 320 330 就是说完全把表格的行列颠倒,有点像那种旋转矩阵,请问如何用sql 语句实现? */ if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_zj]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[p_zj] GO /*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/ create proc p_zj @tbname sysname, --要处理的表名  @fdname sysname, --做为转换的列名  @new_fdname sysname='' --为转换后的列指定列名 as declare @s1 varchar(8000) , @s2 varchar(8000), @s3 varchar(8000) , @s4 varchar(8000), @s5 varchar(8000) , @i varchar(10) select @s1 = '' , @s2 = '' , @s3 = '' , @s4 = '' , @s5 = '' , @i = '0' select @s1 = @s1 + ',@' + @i + ' varchar(8000)', @s2 = @s2 + ',@' + @i + '=''' + case isnull(@new_fdname , '') when '' then ''  else @new_fdname + '=' end + '''''' + name + '''''''', @s3 = @s3 + 'select @' + @i + '=@' + @i + '+'',['' + [' + @fdname + ']+'']=''+cast([' + name + '] as varchar) from [' + @tbname + ']', @s4 = @s4 + ',@' + @i + '=''select ''+@' + @i, @s5 = @s5 + '+'' union all ''+@' + @i, @i=cast(@i as int)+1 from syscolumns where object_id(@tbname)=id and name<>@fdname select @s1=substring(@s1,2,8000), @s2=substring(@s2,2,8000), @s4=substring(@s4,2,8000), @s5=substring(@s5,16,8000) exec('declare ' + @s1 + 'select ' + @s2 + @s3 + 'select ' + @s4 + ' exec(' + @s5 + ')') go --用上面的存储过程测试: create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int) insert Test select '1月',100,200,300 union all select '2月',110,210,310 union all select '3月',120,220,320 union all select '4月',130,230,330 go exec p_zj 'Test', '月份' , '项目' drop table Test drop proc p_zj /* 项目 1月 2月 3月 4月 ---- ----------- ----------- ----------- ----------- 福利 200 210 220 230 工资 100 110 120 130 奖金 300 310 320 330 (所影响的行数为 3 行) */ /* 静态写法(SQL2005) */ --测试环境 create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int) insert Test select '1月',100,200,300 union all select '2月',110,210,310 union all select '3月',120,220,320 union all select '4月',130,230,330 go --测试语句 SELECT * FROM ( SELECT 考核月份,月份,金额 FROM (SELECT 月份, 工资, 福利, 奖金 FROM Test) p UNPIVOT (金额 FOR 考核月份 IN (工资, 福利, 奖金))AS unpvt ) T PIVOT (MAX(金额) FOR 月份 in ([1月],[2月],[3月],[4月]))AS pt --测试结果 /* 考核月份 1月 2月 3月 4月 ------- ----- ----- ------ ------- 福利200210220230 工资100110120130 奖金300310320330 */ --删除环境 Drop table Test 
      

  3.   

    /*
    将表数据旋转90度(2007-11-19于海南三亚)将下表数据:
    A                    b           c           d           e           
    -------------------- ----------- ----------- ----------- ----------- 
    x                    1           2           3           4
    y                    5           6           7           8
    z                    9           10          11          12转化成如下结果:
    a                    x          y          z          
    -------------------- ---------- ---------- ---------- 
    b                    1          5          9
    c                    2          6          10
    d                    3          7          11
    e                    4          8          12*/--生成测试数据
    create table test1(A varchar(20),b int,c int,d int,e int)
    insert into test1 select 'x',1,2 ,3 ,4
    insert into test1 select 'y',5,6 ,7 ,8
    insert into test1 select 'z',9,10,11,12
    go--生成中间数据表
    declare @s varchar(8000)
    set @s = 'create table test2(a varchar(20)'
    select @s = @s + ',' + A + ' varchar(10)' from test1
    set @s = @s + ')'
    exec(@s)
    print @s
    --借助中间表实现行列转换
    declare @name varchar(20)declare t_cursor cursor for 
    select name from syscolumns 
    where id=object_id('test1') and colid > 1 order by colidopen t_cursorfetch next from t_cursor into @namewhile @@fetch_status = 0
    begin
        exec('select ' + @name + ' as t into test3 from test1')
        set @s='insert into test2 select ''' + @name + ''''
        select @s = @s + ',''' + rtrim(t) + '''' from test3
        exec(@s)
        exec('drop table test3')
        fetch next from t_cursor into @name
    end
    close t_cursor
    deallocate t_cursor--查看行列互换处理结果
    select * from test1
    select * from test2--删除表
    drop table test1
    drop table test2
    ----------------------------------------------------------------------------
    /*固定的写法:*/
    select t1.* , t2.y , t3.z from
    (select a = 'b' , x = b from test1 where a = 'x') t1, 
    (select a = 'b' , y = b from test1 where a = 'y') t2,
    (select a = 'b' , z = b from test1 where a = 'z') t3
    where t1.a = t2.a and t1.a = t2.a
    union all
    select t1.* , t2.y , t3.z from
    (select a = 'c' , x = c from test1 where a = 'x') t1, 
    (select a = 'c' , y = c from test1 where a = 'y') t2,
    (select a = 'c' , z = c from test1 where a = 'z') t3
    where t1.a = t2.a and t1.a = t2.a
    union all
    select t1.* , t2.y , t3.z from
    (select a = 'd' , x = d from test1 where a = 'x') t1, 
    (select a = 'd' , y = d from test1 where a = 'y') t2,
    (select a = 'd' , z = d from test1 where a = 'z') t3
    where t1.a = t2.a and t1.a = t2.a
    union all
    select t1.* , t2.y , t3.z from
    (select a = 'e' , x = e from test1 where a = 'x') t1, 
    (select a = 'e' , y = e from test1 where a = 'y') t2,
    (select a = 'e' , z = e from test1 where a = 'z') t3
    where t1.a = t2.a and t1.a = t2.a----------------------------------------------------------------------------
    /*
    表tb,数据如下:
    项目种类  业绩  提成
    洗吹类  200   10
    外卖      100   5
    合计      300   15
    转换成:
    项目种类  洗吹类  外卖  合计
    业绩      200     100   300
    提成      10      5     15
    */create table tb
    (
      项目种类 varchar(10),
      业绩     int,
      提成     int
    )insert into tb(项目种类,业绩,提成) values('洗吹类',200,10)
    insert into tb(项目种类,业绩,提成) values('外卖'  ,100,5)
    insert into tb(项目种类,业绩,提成) values('合计'  ,300,15)
    goselect 项目种类,sum(洗吹类) as 洗吹类 , sum(外卖) as 外卖 , sum(合计) as 合计 from
    (
      select 项目种类 = '业绩',
             洗吹类   = case when 项目种类 = '洗吹类' then 业绩 else 0 end,
             外卖     = case when 项目种类 = '外卖'   then 业绩 else 0 end,
             合计     = case when 项目种类 = '合计'   then 业绩 else 0 end
      from tb
    union all
      select 项目种类 = '提成' ,
             洗吹类   = case when 项目种类 = '洗吹类' then 提成 else 0 end,
             外卖     = case when 项目种类 = '外卖'   then 提成 else 0 end,
             合计     = case when 项目种类 = '合计'   then 提成 else 0 end
      from tb
    ) m
    group by 项目种类
    order by 项目种类 descdrop table tb/*
    项目种类 洗吹类      外卖        合计          
    -------- ----------- ----------- ----------- 
    业绩     200         100         300
    提成     10          5           15(所影响的行数为 2 行)
    */--------------------------------------------------------------------------
    /*
    数据库中tb表格如下
     
    月份    工资   福利  奖金
    1月     100    200   300
    2月     110    210   310
    3月     120    220   320
    4月     130    230   330我想得到的结果是项目   1月    2月  3月  4月
    工资   100    110  120  130
    福利   200    210  220  230
    奖金   300    310  320  330就是说完全把表格的行列颠倒,有点像那种旋转矩阵,请问如何用sql 语句实现?
    */if exists (select * from dbo.sysobjects
    where id = object_id(N'[dbo].[p_zj]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_zj]
    GO
    /*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/create proc p_zj
           @tbname sysname, --要处理的表名
           @fdname sysname, --做为转换的列名
           @new_fdname sysname='' --为转换后的列指定列名
    as
    declare @s1 varchar(8000) , @s2 varchar(8000),
            @s3 varchar(8000) , @s4 varchar(8000),
            @s5 varchar(8000) , @i varchar(10)
    select @s1 = '' , @s2 = '' , @s3 = '' , @s4 = '' , @s5 = '' , @i = '0'
    select @s1 = @s1 + ',@' + @i + ' varchar(8000)',
           @s2 = @s2 + ',@' + @i + '=''' + case isnull(@new_fdname , '') when '' then ''
           else @new_fdname + '=' end + '''''' + name + '''''''',
           @s3 = @s3 + 'select @' + @i + '=@' + @i + '+'',['' + [' + @fdname + 
           ']+'']=''+cast([' + name + '] as varchar) from [' + @tbname + ']',
           @s4 = @s4 + ',@' + @i + '=''select ''+@' + @i,
           @s5 = @s5 + '+'' union all ''+@' + @i,
           @i=cast(@i as int)+1
    from syscolumns
    where object_id(@tbname)=id and name<>@fdnameselect @s1=substring(@s1,2,8000),
           @s2=substring(@s2,2,8000),
           @s4=substring(@s4,2,8000),
           @s5=substring(@s5,16,8000)
    exec('declare ' + @s1 + 'select ' + @s2 + @s3 + 'select ' + @s4 + '
    exec(' + @s5 + ')')
    go--用上面的存储过程测试:create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
    insert Test 
    select '1月',100,200,300 union all
    select '2月',110,210,310 union all
    select '3月',120,220,320 union all
    select '4月',130,230,330
    goexec p_zj 'Test', '月份' , '项目'drop table Test
    drop proc p_zj/*
    项目   1月         2月         3月         4月          
    ---- ----------- ----------- ----------- ----------- 
    福利   200         210         220         230
    工资   100         110         120         130
    奖金   300         310         320         330(所影响的行数为 3 行)
    *//*
    静态写法(SQL2005)
    */
    --测试环境
    create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
    insert Test
    select '1月',100,200,300 union all
    select '2月',110,210,310 union all
    select '3月',120,220,320 union all
    select '4月',130,230,330
    go
    --测试语句
    SELECT * FROM 
    (
      SELECT 考核月份,月份,金额 FROM 
         (SELECT 月份, 工资, 福利, 奖金 FROM Test) p
      UNPIVOT
         (金额 FOR 考核月份 IN (工资, 福利, 奖金))AS unpvt
    ) T
    PIVOT
    (MAX(金额)  FOR 月份 in ([1月],[2月],[3月],[4月]))AS pt--测试结果/*
    考核月份  1月     2月      3月     4月
    -------  -----  -----   ------  -------
    福利200210220230
    工资100110120130
    奖金300310320330
    */--删除环境
    Drop table Test
      

  4.   


    Select  GC , MODEL ,Count(A) As A ,Count(B) As B ,Count(C) As C ,Count(D) As D ,Count(E) As E ,Count(F) As F ,Count(G) As G ,Count(H) As H ,Count(Z) As Z
    From TB
    Group By GC , MODEL
    --我覺得就這麽簡單,高手別見笑!
      

  5.   

    /*
    带符号合并行列转换(爱新觉罗.毓华 2007-11-19于海南三亚)有表tb,其数据如下:
      a b
      1 1
      1 2
      1 3
      2 1
      2 2
      3 1
    如何转换成如下结果:
      a b
      1 1,2,3
      2 1,2
      3 1 
    */create table tb
    (
       a int,
       b int
    )
    insert into tb(a,b) values(1,1)
    insert into tb(a,b) values(1,2)
    insert into tb(a,b) values(1,3)
    insert into tb(a,b) values(2,1)
    insert into tb(a,b) values(2,2)
    insert into tb(a,b) values(3,1)
    go--创建一个合并的函数
    create function f_hb(@a int)
    returns varchar(8000)
    as
    begin
      declare @str varchar(8000)
      set @str = ''
      select @str = @str + ',' + cast(b as varchar) from tb where a = @a 
      set @str = right(@str , len(@str) - 1)
      return(@str)
    End
    go--调用自定义函数得到结果:
    select distinct a ,dbo.f_hb(a) as b from tbdrop table tb
    drop function f_hb/*
    结果
    a           b     
    ----------- ------
    1           1,2,3
    2           1,2
    3           1(所影响的行数为 3 行)
    */----------------------------------------------------
    /*
    多个前列的合并
    数据的原始状态如下:
    ID  PR   CON  OP    SC 
    001 p    c    差    6
    001 p    c    好    2
    001 p    c    一般  4
    002 w    e    差    8
    002 w    e    好    7
    002 w    e    一般  1
    用SQL语句实现,变成如下的数据
    ID  PR   CON  OPS
    001 p    c    差(6),好(2),一般(4)
    002 w    e    差(8),好(7),一般(1)
    */create table tb
    (
      id  varchar(10),
      pr  varchar(10),
      con varchar(10),
      op  varchar(10),
      sc  int
    )
     
    insert into tb(ID,PR,CON,OP,SC) values('001', 'p',    'c',    '差',    6)
    insert into tb(ID,PR,CON,OP,SC) values('001', 'p',    'c',    '好',    2)
    insert into tb(ID,PR,CON,OP,SC) values('001', 'p',    'c',    '一般',  4)
    insert into tb(ID,PR,CON,OP,SC) values('002', 'w',    'e',    '差',    8)
    insert into tb(ID,PR,CON,OP,SC) values('002', 'w',    'e',    '好',    7)
    insert into tb(ID,PR,CON,OP,SC) values('002', 'w',    'e',    '一般',  1)
    go--创建一个合并的函数
    create function f_hb(@id varchar(10) , @pr varchar(10) , @con varchar(10))
    returns varchar(8000)
    as
    begin
      declare @str varchar(8000)
      set @str = ''
      select @str = @str + ',' + cast(OP as varchar) + '(' 
                               + cast(sc as varchar) + ')' 
      from tb where id = @id and @pr = pr and @con = con
      set @str = right(@str , len(@str) - 1)
      return(@str)
    End
    go--调用自定义函数得到结果:
    select distinct id , pr , con , dbo.f_hb(id,pr,con) as ops from tbdrop table tb
    drop function f_hb/*
    结果
    id         pr         con        ops               
    ---------- ---------- ---------- ------------------
    001        p          c          差(6),好(2),一般(4)
    002        w          e          差(8),好(7),一般(1)(所影响的行数为 2 行)
    */----------------------------------------------------
    /*如何将一列中所有的值一行显示
    数据源
      a
      b
      c
      d
      e
    结果
    a,b,c,d,e
    */create table tb(col varchar(20))
    insert tb values ('a')
    insert tb values ('b')
    insert tb values ('c')
    insert tb values ('d')
    insert tb values ('e')
    go--方法一
    declare @sql varchar(1000)
    set @sql = ''
    select @sql = @sql + t.col + ',' from (select col from tb) as t
    set @sql='select result = ''' + @sql + ''''
    exec(@sql)
    /*
    result     
    ---------- 
    a,b,c,d,e,
    */--方法二
    declare @output varchar(8000)
    select @output = coalesce(@output + ',' , '') + col from tb
    print @output
    /*
    a,b,c,d,e
    */drop table tb
      

  6.   

    create table tb(gc varchar(10),MODEL varchar(50),status varchar(10))
    insert into tb select 'GSM','SGH-T108+','z'
    insert into tb select 'CDMA','DVD-P248A','h'
    insert into tb select 'CDMA','STW-CG72','c'
    insert into tb select 'CDMA','STW-CG72','h'
    insert into tb select 'CDMA','N70','a'
    insert into tb select 'GSM','SGH-T108+','z'
    insert into tb select 'GSM','SGH-T108+','z'
    insert into tb select 'GSM','SGH-T108+','g'declare @sql varchar(8000)
    select @sql = isnull(@sql+',','') + 'sum(case when status=''' + status + ''' then 1 else 0 end) [' + status + ']'
    from (select distinct status from tb) as a
    set @sql ='select gc,MODEL,'+ @sql + ' from tb group by gc,MODEL'
    exec(@sql) 
    gc MODEL a c g h z
    CDMA DVD-P248A 0 0 0 1 0
    CDMA N70 1 0 0 0 0
    GSM SGH-T108+ 0 0 1 0 3
    CDMA STW-CG72 0 1 0 1 0
      

  7.   

    合并列值
    原著:邹建
    改编:爱新觉罗.毓华  2007-12-16  广东深圳表结构,数据如下:
    id    value
    ----- ------
    1     aa
    1     bb
    2     aaa
    2     bbb
    2     ccc需要得到结果:
    id     values
    ------ -----------
    1      aa,bb
    2      aaa,bbb,ccc
    即:group by id, 求 value 的和(字符串相加)1. 旧的解决方法(在sql server 2000中只能用函数解决。)
    --1. 创建处理函数
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    goCREATE FUNCTION dbo.f_str(@id int)
    RETURNS varchar(8000)
    AS
    BEGIN
        DECLARE @r varchar(8000)
        SET @r = ''
        SELECT @r = @r + ',' + value FROM tb WHERE id=@id
        RETURN STUFF(@r, 1, 1, '')
    END
    GO-- 调用函数
    SELECt id, value = dbo.f_str(id) FROM tb GROUP BY iddrop table tb
    drop function dbo.f_str/*
    id          value      
    ----------- -----------
    1           aa,bb
    2           aaa,bbb,ccc
    (所影响的行数为 2 行)
    */--2、另外一种函数.
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    go--创建一个合并的函数
    create function f_hb(@id int)
    returns varchar(8000)
    as
    begin
      declare @str varchar(8000)
      set @str = ''
      select @str = @str + ',' + cast(value as varchar) from tb where id = @id
      set @str = right(@str , len(@str) - 1)
      return(@str)
    End
    go--调用自定义函数得到结果:
    select distinct id ,dbo.f_hb(id) as value from tbdrop table tb
    drop function dbo.f_hb/*
    id          value      
    ----------- -----------
    1           aa,bb
    2           aaa,bbb,ccc
    (所影响的行数为 2 行)
    */2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    go
    -- 查询处理
    SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY(
            SELECT [values]= STUFF(REPLACE(REPLACE(
                (
                    SELECT value FROM tb N
                    WHERE id = A.id
                    FOR XML AUTO
                ), '<N value="', ','), '"/>', ''), 1, 1, '')
    )N
    drop table tb/*
    id          values
    ----------- -----------
    1           aa,bb
    2           aaa,bbb,ccc(2 行受影响)
    */
      

  8.   

    --这是2000中用函数的方法,2005的方法见上.
    create table tb(GC varchar(10), MODEL varchar(20), STATUS varchar(10))
    insert into tb values('GSM' , 'SGH-T108+', 'Z') 
    insert into tb values('CDMA', 'DVD-P248A', 'H') 
    insert into tb values('CDMA', 'STW-CG72' , 'C') 
    insert into tb values('CDMA', 'STW-CG72' , 'H') 
    insert into tb values('CDMA', 'N70'      , 'A') 
    insert into tb values('GSM' , 'SGH-T108+', 'Z') 
    insert into tb values('GSM' , 'SGH-T108+', 'Z') 
    insert into tb values('GSM' , 'SGH-T108+', 'G') 
    go--创建一个合并的函数
    create function f_hb(@GC varchar(10) , @MODEL varchar(20))
    returns varchar(8000)
    as
    begin
      declare @str varchar(8000)
      set @str = ''
      select @str = @str + ' ' + cast(STATUS as varchar) from tb where GC = @GC and MODEL = @MODEL
      set @str = right(@str , len(@str) - 1)
      return(@str)
    End
    go--调用自定义函数得到结果:
    select distinct GC , MODEL , dbo.f_hb(GC , MODEL) as STATUS from tbdrop table tb
    drop function f_hb/*
    GC         MODEL                STATUS 
    ---------- -------------------- -------
    CDMA       DVD-P248A            H
    CDMA       N70                  A
    CDMA       STW-CG72             C H
    GSM        SGH-T108+            Z Z Z G(所影响的行数为 4 行)
    */
      

  9.   

    create table tb(gc varchar(10),MODEL varchar(50),status varchar(10))
    insert into tb select 'GSM','SGH-T108+','z'
    insert into tb select 'CDMA','DVD-P248A','h'
    insert into tb select 'CDMA','STW-CG72','c'
    insert into tb select 'CDMA','STW-CG72','h'
    insert into tb select 'CDMA','N70','a'
    insert into tb select 'GSM','SGH-T108+','z'
    insert into tb select 'GSM','SGH-T108+','z'
    insert into tb select 'GSM','SGH-T108+','g'declare @sql varchar(8000)
    select @sql = isnull(@sql+',','') + 'sum(case when status=''' + status + ''' then 1 else 0 end) [' + status + ']'
    from (select 'a' as status union all 
    select 'b' as status union all 
    select 'c' as status union all 
    select 'd' as status union all 
    select 'e' as status union all 
    select 'f' as status union all 
    select 'g' as status union all 
    select 'h' as status union all 
    select 'i' as status union all 
    select 'z' as status union all 
    select 'k' as status
    ) as a
    set @sql ='select gc,MODEL,'+ @sql + ' from tb group by gc,MODEL'
    exec(@sql)gc MODEL a b c d e f g h i z k
    CDMA DVD-P248A 0 0 0 0 0 0 0 1 0 0 0
    CDMA N70 1 0 0 0 0 0 0 0 0 0 0
    GSM SGH-T108+ 0 0 0 0 0 0 1 0 0 3 0
    CDMA STW-CG72 0 0 1 0 0 0 0 1 0 0 0
      

  10.   

    create table tb(gc varchar(10),MODEL varchar(50),status varchar(10))
    insert into tb select 'GSM','SGH-T108+','z'
    insert into tb select 'CDMA','DVD-P248A','h'
    insert into tb select 'CDMA','STW-CG72','c'
    insert into tb select 'CDMA','STW-CG72','h'
    insert into tb select 'CDMA','N70','a'
    insert into tb select 'GSM','SGH-T108+','z'
    insert into tb select 'GSM','SGH-T108+','z'
    insert into tb select 'GSM','SGH-T108+','g'select top 25 id=identity(int,0,1),status='a' into # from sysobjects a,sysobjects b
    update # set status=char(ascii(status) +id)declare @sql varchar(8000)
    select @sql = isnull(@sql+',','') + 'sum(case when status=''' + status + ''' then 1 else 0 end) [' + status + ']'
    from #
    set @sql ='select gc,MODEL,'+ @sql + ' from tb group by gc,MODEL'
    exec(@sql) gc MODEL a b c d e f g h i j k l m n o p q r s t u v w x y
    CDMA DVD-P248A 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    CDMA N70 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    GSM SGH-T108+ 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    CDMA STW-CG72 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      

  11.   


    create table #a (CC varchar(10),MODEL varchar(20),STATUS char(1))
    go
    insert into #a values( 'GSM','SGH-T108+','Z')
    insert into #a values('CDMA','DVD-P248A','H')
    insert into #a values('CDMA','STW-CG72', 'C')
    insert into #a values('CDMA','STW-CG72', 'H')
    insert into #a values('CDMA','N70',      'A')
    insert into #a values( 'GSM','SGH-T108+','Z')
    insert into #a values( 'GSM','SGH-T108+','Z')
    insert into #a values( 'GSM','SGH-T108+','G')select * from #adeclare @sql varchar(8000)
    select @sql = 'select CC,MODEL'select @sql = @sql + ',sum(case when STATUS = ''' +STATUS+ ''' then 1 else 0 end) as '''+STATUS+''''
     from (select distinct STATUS from #a) aselect @sql = @sql + ' from #a group by CC,MODEL'
    exec (@sql)drop table #a
      

  12.   

    在坛子里,二楼.三楼的代码见Ctrl + C 和 Ctrl + V 好多次了:P