本帖最后由 Miracle_Lee 于 2012-09-05 22:12:22 编辑

解决方案 »

  1.   


    -->try
    select Model,
     status,
     LineA_PASS=(case when Model='A' and status='PASS' then LineA else 0 end),
     LineA_FAIL=(case when Model='A' and status='FAIL' then LineA else 0 end),
     LineB_PASS=(case when Model='B' and status='PASS' then LineB else 0 end),
     LineB_FAIL=(case when Model='B' and status='FAIL' then LineB else 0 end),
     LineC_PASS=(case when Model='C' and status='PASS' then LineC else 0 end),
     LineC_FAIL=(case when Model='C' and status='FAIL' then LineC else 0 end)
    from
    (
     select Model,status,sum(LineA) LineA,sum(LineB) LineB,sum(LineC) LineC
     from 表
     group by Model,status
    )t 
      

  2.   

    select Model,
     status,
     LineA_PASS=sum(case when Model='A' and status='PASS' then LineA else 0 end),
     LineA_FAIL=sum(case when Model='A' and status='FAIL' then LineA else 0 end),
     LineB_PASS=sum(case when Model='B' and status='PASS' then LineB else 0 end),
     LineB_FAIL=sum(case when Model='B' and status='FAIL' then LineB else 0 end),
     LineC_PASS=sum(case when Model='C' and status='PASS' then LineC else 0 end),
     LineC_FAIL=sum(case when Model='C' and status='FAIL' then LineC else 0 end)
    from
    tb
      

  3.   

    很遗憾,楼上的结果都不对
    USE tempdb
     GO
     CREATE TABLE test 
     (
     Model CHAR(2),
     status CHAR(4),
     LineA INT ,
     LineB INT,
     lineC INT 
     )
     INSERT INTO test
     
     SELECT 'A' ,'FAIL', 9, 0 ,0
     UNION ALL 
     SELECT 'A', 'PASS', 10, 0 ,0
     UNION ALL 
     SELECT 'A' ,'PASS', 12 ,0 ,0
     UNION ALL 
     SELECT 'B', 'FAIL', 0, 9 ,0
     UNION ALL 
     SELECT 'B', 'FAIL' ,0 ,2 ,0
     UNION ALL 
     SELECT 'B', 'PASS', 0, 5 ,0
     UNION ALL 
     SELECT 'C', 'FAIL', 0 ,9 ,0
     UNION ALL 
     SELECT 'C', 'FAIL', 0, 7 ,0
     UNION ALL 
     SELECT 'C', 'PASS', 0 ,6 ,0
     
     
     SELECT Model, 
      LineA_PASS=SUM(CASE WHEN Model='A' AND status='PASS' THEN LineA ELSE 0 END),
      LineA_FAIL=SUM(CASE WHEN Model='A' AND status='FAIL' THEN LineA ELSE 0 END),
      LineB_PASS=SUM(CASE WHEN Model='B' AND status='PASS' THEN LineB ELSE 0 END),
      LineB_FAIL=SUM(CASE WHEN Model='B' AND status='FAIL' THEN LineB ELSE 0 END),
      LineC_PASS=SUM(CASE WHEN Model='C' AND status='PASS' THEN LineC ELSE 0 END),
      LineC_FAIL=SUM(CASE WHEN Model='C' AND status='FAIL' THEN LineC ELSE 0 END)
     FROM
     (
      SELECT Model,status,SUM(LineA) LineA,SUM(LineB) LineB,SUM(LineC) LineC
      FROM test
      GROUP BY Model,status
     )t 
     GROUP BY Model
     
    结果;
    Model LineA_PASS  LineA_FAIL  LineB_PASS  LineB_FAIL  LineC_PASS  LineC_FAIL
     ----- ----------- ----------- ----------- ----------- ----------- -----------
     A     22          9           0           0           0           0
     B     0           0           5           11          0           0
     C     0           0           0           0           0           0
     
     (3 行受影响)
      

  4.   

    说明一下C为什么结果和楼主的不一样,因为你的数据里面C的数据全部在LineB中,所以和你的期望值是不一样的。
      

  5.   


    --行列互转
    --摘自中国风博客,引用请标明内容来源
    --1、行换列
    if object_id('Class') is not  null
        drop table Class
    Go
    Create table Class(
    [Student] nvarchar(2),
    [Course] nvarchar(2),
    [Score] int)
    Insert Class
    select N'张三',N'语文',78 union all
    select N'张三',N'数学',87 union all
    select N'张三',N'英语',82 union all
    select N'张三',N'物理',90 union all
    select N'李四',N'语文',65 union all
    select N'李四',N'数学',77 union all
    select N'李四',N'英语',65 union all
    select N'李四',N'物理',85 
    Go--2000方法:
    --动态:
    declare @s nvarchar(4000)
    set @s=''
    Select @s=@s+','+quotename([Course])+'=max(case when [Course]='    
       
        +quotename([Course],'''')+' then [Score] else 0 end)'
    from 
        Class group by[Course]
    --select @s
    exec('select [Student]'+@s+' from Class group by [Student]')
    --生成静态:
    select 
        [Student],
        [数学]=max(case when [Course]='数学' then [Score] else 0 end),
        [物理]=max(case when [Course]='物理' then [Score] else 0 end),
        [英语]=max(case when [Course]='英语' then [Score] else 0 end),
        [语文]=max(case when [Course]='语文' then [Score] else 0 end) 
    from 
        Class 
    group by [Student]
    GO
    --动态:declare @s nvarchar(4000)
    Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]
    select @s
    exec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')--生成静态:
    select * 
    from 
        Class 
    pivot 
        (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b--生成格式:
    /*
    Student 数学         物理         英语         语文
    ------- ----------- ----------- ----------- -----------
    李四     77          85          65          65
    张三     87          90          82          78(2 行受影响)
    */go
    --加上总成绩(学科平均分)--2000方法:
    --动态:declare @s nvarchar(4000)
    set @s=''
    Select @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+'then [Score] else 0 end)'
    from Class group by[Course]
    exec('select [Student]'+@s+',[总成绩]=sum([Score])  from Class group by [Student]')--加多一列(学科平均分用avg([Score]))生成动态:select 
        [Student],
        [数学]=max(case when [Course]='数学' then [Score] else 0 end),
        [物理]=max(case when [Course]='物理' then [Score] else 0 end),
        [英语]=max(case when [Course]='英语' then [Score] else 0 end),
        [语文]=max(case when [Course]='语文' then [Score] else 0 end),
        [总成绩]=([Score]) --加多一列(学科平均分用avg([Score]))
    from 
        Class 
    group by [Student]go--2005方法:动态:declare @s nvarchar(4000)
    Select  @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] 
    --isnull(@s+',','') 去掉字符串@s中第一个逗号exec('select [Student],'+@s+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a 
    pivot (max([Score]) for [Course] in('+@s+'))b ')--生成静态:select 
        [Student],[数学],[物理],[英语],[语文],[总成绩] 
    from 
        (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a --平均分时用avg([Score])
    pivot 
        (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b 生成格式:/*
    Student 数学         物理         英语         语文         总成绩
    ------- ----------- ----------- ----------- ----------- -----------
    李四     77          85          65          65          292
    张三     87          90          82          78          337(2 行受影响)
    */go--2、列转行
     
    if not object_id('Class') is null
        drop table Class
    Go
    Create table Class([Student] nvarchar(2),[数学] int,[物理] int,[英语] int,[语文] int)
    Insert Class
    select N'李四',77,85,65,65 union all
    select N'张三',87,90,82,78
    Go--2000:动态:declare @s nvarchar(4000)
    select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一个union all
    +',[Score]='+quotename(Name)+' from Class'
    from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不转换的列
    order by Colid
    exec('select * from ('+@s+')t order by [Student],[Course]')--增加一个排序生成静态:
    select * 
    from (select [Student],[Course]='数学',[Score]=[数学] from Class union all 
    select [Student],[Course]='物理',[Score]=[物理] from Class union all 
    select [Student],[Course]='英语',[Score]=[英语] from Class union all 
    select [Student],[Course]='语文',[Score]=[语文] from Class)t 
    order by [Student],[Course]go
    --2005:动态:declare @s nvarchar(4000)
    select @s=isnull(@s+',','')+quotename(Name)
    from syscolumns where ID=object_id('Class') and Name not in('Student') 
    order by Colid
    exec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')go
    select 
        Student,[Course],[Score] 
    from 
        Class 
    unpivot 
        ([Score] for [Course] in([数学],[物理],[英语],[语文]))b
    生成格式:
    /*
    Student Course Score
    ------- ------- -----------
    李四     数学     77
    李四     物理     85
    李四     英语     65
    李四     语文     65
    张三     数学     87
    张三     物理     90
    张三     英语     82
    张三     语文     78
    */
    自己选方法吧
      

  6.   

    下面这样就行了-->try
    select * from 表
    select Model,
     LineA_PASS=sum(case when Model='A' and status='PASS' then LineA else 0 end),
     LineA_FAIL=sum(case when Model='A' and status='FAIL' then LineA else 0 end),
     LineB_PASS=sum(case when Model='B' and status='PASS' then LineB else 0 end),
     LineB_FAIL=sum(case when Model='B' and status='FAIL' then LineB else 0 end),
     LineC_PASS=sum(case when Model='C' and status='PASS' then LineC else 0 end),
     LineC_FAIL=sum(case when Model='C' and status='FAIL' then LineC else 0 end)
    from 表
    group by Model
    /*
    Model LineA_PASS  LineA_FAIL  LineB_PASS  LineB_FAIL  LineC_PASS  LineC_FAIL
    ----- ----------- ----------- ----------- ----------- ----------- -----------
    A     22          9           0           0           0           0
    B     0           0           5           11          0           0
    C     0           0           0           0           0           0
    */
      

  7.   

    这里我只是举个例子,Model可能会有很多,远不止A,B,C这三个
      

  8.   

    用动态sql就可以了declare @sql varchar(max)
    select @sql=isnull(@sql+',','')+'Line'+ltrim(rtrim(Model))+'_PASS=sum(case when Model='''+ltrim(rtrim(Model))+''' and status=''PASS'' then Line'+ltrim(rtrim(Model))+' else 0 end),'
    ++'Line'+ltrim(rtrim(Model))+'_FAIL=sum(case when Model='''+ltrim(rtrim(Model))+''' and status=''FAIL'' then Line'+ltrim(rtrim(Model))+' else 0 end)'
    from (select distinct Model from 你的表)t
    set @sql='select Model,'+@sql+' from 你的表 group by Model'
    --print @sql
    exec(@sql)
      

  9.   

    http://bbs.csdn.net/topics/390202576/close