原表结构如下:项目 收入 
P1  10 
p2  20 
p3  30
 
要求变成下面表的存储结构:
 
项目  p1  p2  p3 
收入  10  20  30 怎样实现,哪个高手给个代码,谢谢!

解决方案 »

  1.   

    select '项目'项目,
           p1=max(case when 项目='P1' then 收入 else 0 end ),
           p2=max(case when 项目='P2' then 收入 else 0 end ),
           p3=max(case when 项目='P3' then 收入 else 0 end )
    from tb
      

  2.   

    --> 生成测试数据表:tbIf not object_id('[tb]') is null
    Drop table [tb]
    Go
    Create table [tb]([项目] nvarchar(2),[收入] int)
    Insert [tb]
    Select N'P1',10 union all
    Select N'p2',20 union all
    Select N'p3',30
    Go
    --Select * from [tb]-->SQL查询如下:
    select 项目='收入',* 
    from tb
    pivot(max(收入) for 项目 in(p1,p2,p3))b
    /*
    项目 p1 p2 p3
    收入 10 20 30
    */
      

  3.   

    -->==============================================
    -->Title:生成测试数据
    -->Author:wufeng4552【水族杰纶】
    -->Environment: MSSQL2005
    -->Date:2009-09-06
    -->==============================================
     
    if not object_id('tb') is null
    drop table tb
    Go
    Create table tb([项目] nvarchar(2),[收入] int)
    Insert tb
    select N'P1',10 union all
    select N'p2',20 union all
    select N'p3',30
    Go
    select '收入'项目,
           p1=max(case when 项目='P1' then 收入 else 0 end ),
           p2=max(case when 项目='P2' then 收入 else 0 end ),
           p3=max(case when 项目='P3' then 收入 else 0 end )
    from tb
    /*
    项目   p1          p2          p3
    ---- ----------- ----------- -----------
    收入   10          20          30(1 行受影响)
    */
      

  4.   


    ---sql2000动态If not object_id('[tb]') is null
        Drop table [tb]
    Go
    Create table [tb]([项目] varchar(2),[收入] int)
    Insert [tb]
    Select 'P1',10 union all
    Select 'p2',20 union all
    Select 'p3',30
    Go
    declare @str varchar(400)
    set @str=''select @str=@str+','+项目+'=max(case when 项目='''+项目+''' then 收入 else 0 end )'
    from (select distinct 项目 from tb)tset @str='select ''收入''as 项目'+@str+' from tb '
    exec(@str)项目   P1          p2          p3
    ---- ----------- ----------- -----------
    收入   10          20          30(1 行受影响)
      

  5.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2009-09-06 22:05:39
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([项目] varchar(2),[收入] int)
    insert [tb]
    select 'P1',10 union all
    select 'p2',20 union all
    select 'p3',30
    --------------开始查询--------------------------
    select 
           '项目'项目,
           p1=max(case when 项目='P1' then 收入 else 0 end ),
           p2=max(case when 项目='P2' then 收入 else 0 end ),
           p3=max(case when 项目='P3' then 收入 else 0 end )
    from 
           tb
    ----------------结果----------------------------
    /* 项目   p1          p2          p3
    ---- ----------- ----------- -----------
    项目   10          20          30(1 行受影响)
    */
      

  6.   

    --> 生成测试数据表:tbIf not object_id('[tb]') is null
        Drop table [tb]
    Go
    Create table [tb]([项目] nvarchar(2),[收入] int)
    Insert [tb]
    Select N'P1',10 union all
    Select N'p2',20 union all
    Select N'p3',30
    Go
    --Select * from [tb]-->SQL查询如下:
    --05动态
    declare @s varchar(max)
    select @s=isnull(@s+',','')+quotename(项目) from tb group by 项目
    exec('select 项目=''收入'',* from tb pivot(max(收入) for 项目 in('+@s+'))b')
    /*
    项目   P1          p2          p3
    ---- ----------- ----------- -----------
    收入   10          20          30(1 行受影响)
    */
      

  7.   


    IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
    GO
    CREATE TABLE TB(
    PRO VARCHAR(50),
    MON INT
    )
    INSERT INTO TB
    SELECT 'P1',  10 UNION ALL
    SELECT 'p2',  20 UNION ALL
    SELECT 'p3',  30 UNION ALL 
    SELECT 'P3',  10 UNION ALL
    SELECT 'p1',  22 UNION ALL
    SELECT 'p2',  33 DECLARE @STR VARCHAR(8000)
    SELECT  @STR=ISNULL(@STR+',SUM(CASE WHEN PRO=''','SELECT SUM(CASE WHEN PRO=''')
    +PRO+''' THEN MON ELSE 0 END)'+PRO
    FROM TB
    GROUP BY PRO
    EXEC (@STR+' FROM TB')/*
    32 53 40
    */