none
一个sql语句在sqlserver2008环境中无法运行 RRS feed

  • 问题

  • 表结构:

    SQL 语句

    declare @sql varchar(8000)

    set @sql = 'select ys,'

    select @sql = @sql + 'sum(case ym when '''+ym+''' then sl else '''' end) as '''+ym+''',' from (select distinct ym from sxh) as a

    select @sql = left(@sql,len(@sql)-1) + ' from sxh group by ys'

    exec(@sql)

    go

    2012年6月20日 6:34

答案

  • 没有结果是因为你的数据中有null ,null 加任何值都为null.

    这样修改一下就可以了。

    if object_id('[sxh]') is not null drop table [sxh]
    create table [sxh]([ys] int,[ym] varchar(7),[sl] int)
    insert [sxh]
    select -1,null,118 union all
    select -1,'2011-12',5 union all
    select -1,'2012-01',1056 union all
    select -1,'2012-02',426 union all
    select -1,'2012-03',68 union all
    select -1,'2012-04',22 union all
    select -1,'2012-05',1 union all
    select null,null,4 union all
    select 24,'2010-05',1 union all
    select 14,'2011-03',1 union all
    select 11,'2011-05',3 union all
    select 12,'2011-05',1 union all
    select 3,'2011-07',2 union all
    select 8,'2011-08',1 union all
    select 9,'2011-08',4 union all
    select 10,'2011-08',1
    
    declare @sql varchar(8000) 
    set @sql = 'select ys,'
    select @sql = @sql + 
    'sum(case ym when '''+isnull(ym,'null')+''' then sl else '''' end) as '''+isnull(ym,'null')+''',' from 
    (select distinct ym from sxh) as a
    select @sql = left(@sql,len(@sql)-1) + ' from sxh group by ys'
    exec(@sql)
    /*
    ys          null        2010-05     2011-03     2011-05     2011-07     2011-08     2011-12     2012-01     2012-02     2012-03     2012-04     2012-05
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
    NULL        0           0           0           0           0           0           0           0           0           0           0           0
    -1          0           0           0           0           0           0           5           1056        426         68          22          1
    3           0           0           0           0           2           0           0           0           0           0           0           0
    8           0           0           0           0           0           1           0           0           0           0           0           0
    9           0           0           0           0           0           4           0           0           0           0           0           0
    10          0           0           0           0           0           1           0           0           0           0           0           0
    11          0           0           0           3           0           0           0           0           0           0           0           0
    12          0           0           0           1           0           0           0           0           0           0           0           0
    14          0           0           1           0           0           0           0           0           0           0           0           0
    24          0           1           0           0           0           0           0           0           0           0           0           0
    */
    

    2012年6月20日 7:55
    版主
  • 你调试一下你的select @sql 就很直观了。

    要么按照我刚才写的把ym变成isnull(ym,'null')

    要么把null过滤掉 :(select distinct ym from sxh where ym is not null)。

    根据你的需求选择对应的方式就可以了。

    2012年6月20日 7:58
    版主

全部回复

  • 在sql2000里执行的效果是:

    但是在2008里执行不报错也没有结果,望高手指点。

    2012年6月20日 6:35
  • 没有结果是因为你的数据中有null ,null 加任何值都为null.

    这样修改一下就可以了。

    if object_id('[sxh]') is not null drop table [sxh]
    create table [sxh]([ys] int,[ym] varchar(7),[sl] int)
    insert [sxh]
    select -1,null,118 union all
    select -1,'2011-12',5 union all
    select -1,'2012-01',1056 union all
    select -1,'2012-02',426 union all
    select -1,'2012-03',68 union all
    select -1,'2012-04',22 union all
    select -1,'2012-05',1 union all
    select null,null,4 union all
    select 24,'2010-05',1 union all
    select 14,'2011-03',1 union all
    select 11,'2011-05',3 union all
    select 12,'2011-05',1 union all
    select 3,'2011-07',2 union all
    select 8,'2011-08',1 union all
    select 9,'2011-08',4 union all
    select 10,'2011-08',1
    
    declare @sql varchar(8000) 
    set @sql = 'select ys,'
    select @sql = @sql + 
    'sum(case ym when '''+isnull(ym,'null')+''' then sl else '''' end) as '''+isnull(ym,'null')+''',' from 
    (select distinct ym from sxh) as a
    select @sql = left(@sql,len(@sql)-1) + ' from sxh group by ys'
    exec(@sql)
    /*
    ys          null        2010-05     2011-03     2011-05     2011-07     2011-08     2011-12     2012-01     2012-02     2012-03     2012-04     2012-05
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
    NULL        0           0           0           0           0           0           0           0           0           0           0           0
    -1          0           0           0           0           0           0           5           1056        426         68          22          1
    3           0           0           0           0           2           0           0           0           0           0           0           0
    8           0           0           0           0           0           1           0           0           0           0           0           0
    9           0           0           0           0           0           4           0           0           0           0           0           0
    10          0           0           0           0           0           1           0           0           0           0           0           0
    11          0           0           0           3           0           0           0           0           0           0           0           0
    12          0           0           0           1           0           0           0           0           0           0           0           0
    14          0           0           1           0           0           0           0           0           0           0           0           0
    24          0           1           0           0           0           0           0           0           0           0           0           0
    */
    

    2012年6月20日 7:55
    版主
  • 你调试一下你的select @sql 就很直观了。

    要么按照我刚才写的把ym变成isnull(ym,'null')

    要么把null过滤掉 :(select distinct ym from sxh where ym is not null)。

    根据你的需求选择对应的方式就可以了。

    2012年6月20日 7:58
    版主
  • 谢谢这位大哥的支持,已经解决了。
    2012年6月20日 8:30