需要的结果是 
编号    A    B    C  
0001    150  140  0  
0002    0    35   26
0003    0    0    45
select 编号, 
sum(case when  类别='a' then 金额 else 0 ) A,
sum(case when  类别='b' then 金额 else 0 ) B,
sum(case when  类别='c' then 金额 else 0 ) C
from 表  group by 编号

解决方案 »

  1.   

    create table t(编号 varchar(4),金额 money,类别 varchar(1))
    insert into t
    select '0001',150,'A'
    union all select '0001',140,'B'
    union all select '0002',35,'B'
    union all select '0002',26,'C'
    union all select '0003',45,'C'
    --select * from tselect 编号,sum((case 类别 when 'A' then 金额 else 0 end)) as A,
    sum((case 类别 when 'B' then 金额 else 0 end)) as B,
    sum((case 类别 when 'C' then 金额 else 0 end)) as C
    from t group by 编号drop table t
      

  2.   

    declare @sql varchar(8000)
    set @sql = 'select 编号,'
    select @sql = @sql + 'sum(case 类别 when '''+类别+''' 
    then 金额 else 0 end) as '''+类别+''','
    from (select distinct 编号 from test) as a
    select @sql = left(@sql,len(@sql)-1) + ' from test group by 编号'
    exec(@sql)
    go
    如果类别多的就这样
    付款方式表也先这样处理,再2个表内连就可以了付款方式表
      

  3.   

    jackycontact() ( ) 信誉:100    Blog   加为好友  2007-06-23 10:22:30  得分: 0  
     
     
       类别不是固定的,或者后面可能增加呢?
      
     
    --------------
    使用動態SQL語句
    Declare @S Nvarchar(4000)
    Select @S = N' Select 编号'
    Select @S = @S + N', SUM(Case 类别 When ''' + 类别 + N''' Then 金额 Else 0 End) As ' + 类别
    From 表1 Group By 类别
    Select @S = @S + N' From 表1 Group By 编号'
    EXEC(@S)
      

  4.   

    paoluo(一天到晚游泳的鱼
      按照你这个我的类别多个怎么传参数,还有付款方式连接到后面怎么写动态SQl呢
      

  5.   

    jackycontact() ( ) 信誉:100    Blog   加为好友  2007-06-23 10:45:22  得分: 0  
     
     
       paoluo(一天到晚游泳的鱼
      按照你这个我的类别多个怎么传参数,还有付款方式连接到后面怎么写动态SQl呢
      
     
    -----------
    "按照你这个我的类别多个怎么传参数", 你要傳入的參數是不是要指定的類別?
      

  6.   

    至於“付款方式连接到后面怎么写动态SQl呢”,你最好重新舉例,寫出完整的需求。你的付款方式是不是固定只有3種,3種是隨便對應?還是“人民币 ”固定為第一種?
      

  7.   

    我按照你给的动态sql查询的结果会出现这种:
    编号   类别1    类别1   类别1   类别1
    0001   120        120    120      120
    或者
    编号   类别1    类别2   类别2   类别2   类别2
    0001   120        240    240      240    240也就是说最后一个类别会出现4次???
      

  8.   

    jackycontact() ( ) 信誉:100    Blog   加为好友  2007-06-23 10:57:20  得分: 0  
     
     
       我按照你给的动态sql查询的结果会出现这种:
    编号   类别1    类别1   类别1   类别1
    0001   120        120    120      120
    或者
    编号   类别1    类别2   类别2   类别2   类别2
    0001   120        240    240      240    240也就是说最后一个类别会出现4次???
      
     
    --------------
    你確定你的實際需求和你的舉例是一致的嗎?根據你的示例得到的結果不會是你那樣子的。
    Create Table 表1(编号 Varchar(4), 金额 Int, 类别 Varchar(1))
    Insert 表1
    Select '0001',150,'A'
    Union All Select '0001',140,'B'
    Union All Select '0002',35,'B'
    Union All Select '0002',26,'C'
    Union All Select '0003',45,'C'
    GO
    Declare @S NVarchar(4000)
    Select @S = N' Select 编号'
    Select @S = @S + N', SUM(Case 类别 When ''' + 类别 + N''' Then 金额 Else 0 End) As ' + 类别
    From 表1 Group By 类别
    Select @S = @S + N' From 表1 Group By 编号'
    EXEC(@S)
    GO
    Drop Table 表1
    --結果
    /*
    编号 A B C
    0001 150 140 0
    0002 0 35 26
    0003 0 0 45
    */
      

  9.   

    paoluo(一天到晚游泳的鱼) ( ) 信誉:100    Blog   加为好友  2007-6-23 10:53:42  得分: 0  
     
     
       
    至於“付款方式连接到后面怎么写动态SQl呢”,你最好重新舉例,寫出完整的需求。你的付款方式是不是固定只有3種,3種是隨便對應?還是“人民币 ”固定為第一種?
      
     
      

  10.   

    没有固定,付款方式也不是固定3种,我用你上面的语句还有个问题就是在分类那里 as 后面显示列名的时候我的不能显示每个列的实际名字,只能给定一个名字Declare @S Nvarchar(4000)
    Select @S = N' Select BH'
    Select @S = @S + N', SUM(Case LeiBie When ''' + leiBie + N''' Then JinE Else 0 End) As ' + LeiBie
    From table Group By LeiBie
    Select @S = @S + N' From table Group By BH'
    EXEC(@S)这样就会报错