使用级别以知可用case ,否则不知道

解决方案 »

  1.   

    --建立测试环境
    Create table TEST
    (数据来源 Nvarchar(20),
    使用级别  Nvarchar(20),
    记录数 Int
    )
    GO
    --插入数据
    Insert  TEST Values(N'读者库',N'VIP',10)
    Insert  TEST Values(N'读者库',N'一般用户',3)
    Insert  TEST Values(N'读者库',N'专家',8)
    Insert  TEST Values(N'会员库',N'VIP',20)
    Insert  TEST Values(N'会员库',N'专家',4)
    Insert  TEST Values(N'资源库',N'专家',100)
    Insert  TEST Values(N'资源库',N'一般用户',30)
    GO
    --测试
    Select * from TEST--删除测试环境
    Drop table TEST
    --结果
    /*
    数据来源 VIP 一般用户 专家
    读者库 10 3 8
    会员库 20 0 4
    会员库 20 0 4
    资源库 0 30 100*/
      

  2.   

    注意,
    1 所取的任意两个字段类型不定,它们各自的不重复值是不固定的,可能有3种,也可能多种;
    所有楼上建立临时test时其中的字段类型参数是不定的
    还是请楼上贴出代码来看看吧
      

  3.   

    --如果你要在SELECT-GROUP取出的结果中处理,那就先把结果保存到临时表,然后再处理--假设下面是SELECT-GROUP取数据后保存的临时表
    Create table #(数据来源 Nvarchar(20),使用级别 Nvarchar(20),记录数 Int)
    Insert  # Values(N'读者库',N'VIP',10)
    Insert  # Values(N'读者库',N'一般用户',3)
    Insert  # Values(N'读者库',N'专家',8)
    Insert  # Values(N'会员库',N'VIP',20)
    Insert  # Values(N'会员库',N'专家',4)
    Insert  # Values(N'资源库',N'专家',100)
    Insert  # Values(N'资源库',N'一般用户',30)--对临时表中的数据做转换处理
    declare @s nvarchar(4000)
    set @s=''
    select @s=@s+','+quotename(使用级别)
    +'=isnull(max(case 使用级别 when '+quotename(使用级别,'''')
    +' then 记录数 end),0)'
    from # group by 使用级别
    exec('select 数据来源'+@s+' from # group by 数据来源')
    go--删除测试环境
    Drop table #/*--结果数据来源                 VIP         一般用户        专家          
    -------------------- ----------- ----------- ----------- 
    读者库                  10          3           8
    会员库               0   20          0           4
    资源库                  0           30          10
    */
      

  4.   

    --应该用sub
    --对临时表中的数据做转换处理
    declare @s nvarchar(4000)
    set @s=''
    select @s=@s+','+quotename(使用级别)
    +'=isnull(sum(case 使用级别 when '+quotename(使用级别,'''')
    +' then 记录数 end),0)'
    from # group by 使用级别
    exec('select 数据来源'+@s+' from # group by 数据来源')
      

  5.   

    /*
    一般来说,建议跳过SELECT-GROUP
    直接从源表中取要转换为行头字段的数据,生成交叉列
    然后再从源表中交叉查询数据
    */--以sysobjects表查询为例,假设要查询name like 'sys%'的所有数据,列字段要求为status,行字段要求为xtype,统计其记录数--则用下面的语句:
    declare @s nvarchar(4000)
    set @s=''
    select @s=@s+','+quotename(xtype)
    +'=isnull(sum(case xtype when '+quotename(xtype,'''')
    +' then 1 end),0)'
    from sysobjects
    where name like 'sys%'
    group by xtype
    exec('select status'+@s+' from sysobjects where name like ''sys%'' group by status')/*--结果status      S           V           
    ----------- ----------- ----------- 
    -1610612736 0           2
    -536870912  1           0
    -536870911  4           0
    -536870909  8           0
    -536870907  1           0
    -534773760  5           0
    --*/
      

  6.   

    我的做法是,先把你的源表按照你想的group存放在一個新表
    例如你的源表是tablea(name,a,b)你按你的group by 生成a(name,a,b)
    select * into a from tablea group by 條件
    然後就參照以下行列轉換
    declare @a varchar(1000)
    set @a='select name '
    select @a=@a+',sum(case when a='''+a+''' then b end)'+' as '+ a ----這裡sum改為min或max結果一樣
    from (select distinct a from a)T1
    set @a=@a+'from #a group by name'
    exec(@a)
    ----------然後a表就是你所求的