昨天我发了一贴:
http://topic.csdn.net/u/20110317/11/7cbf0c44-0ad1-4a3d-b49b-40de914603f1.htmldeclare @str varchar(max)
set @str=''
select @str=@str+','+'sum(case when 模具类型='''+模具类型+''' then 数量 else 0 end)['+模具类型+']' 
      from #tb2 group by 模具类型
set @str='select ''数量'' as [模具类型]'+@str+' from #tb2 A inner join #tb1 B on A.tb1ID=B.id where B.部品=''b3''
          and b.订单时间 between ''2011-03-1 00:00:00.000'' and ''2011-03-6 00:00:00.000'' and B.确认=''OK'' and B.供应商=''G3'''exec (@str)
/*
模具类型 A#          B#          C#          D#
---- ----------- ----------- ----------- -----------
数量   40          20          5           15现在问题描述:
在上面的临时表是可以的print出@str,到了正式表格什么也不显示了  
也无法print出@str[code=SQL]
declare @str varchar(8000)
set @str='' 
select @str=@str+','+'sum(case when 模具类型='''+模具类型+''' then 数量 else 0 end)['+模具类型+']' 
      from #tb2 group by 模具类型 order by '数量' 
print(@str)  ---临时测试表是OK,正式表格的什么也不显示
正式表格在没有行转列之前是可以显示出数据的,表格有数据!!请问 上面写法 正式数据表需要什么注意的吗?或修改些写法?在正式表格把@str=''他去掉后,这样写的话(是否和空值有关系呢,如何修改呢?)select @str=+','+'sum(case when 模具类型='''+模具类型+''' then 数量 else 0 end)['+模具类型+']' 
from #tb2 group by 模具类型
可以得到的就一列,说明表格有数据... 不去掉就什么也不显示了(临时测试的是OK的)
2:如果修改可以加个排序 得到效果
/*
模具类型 A#          B#          D#          C#
---- ----------- ----------- ----------- -----------
数量   40          20          15           5
那位大侠  遇到过这样的情况 告诉下 不知道如何描述了谢谢!!

解决方案 »

  1.   

    肯定是加NULL了
    你说了半天为什么不把你出问题的正式表的脚本帖出来??
      

  2.   

    什么正式表,临时表的,print出来看看就知道了。
      

  3.   

    现在问题描述:
    在上面的临时表是可以的print出@str,到了正式表格什么也不显示了  
    也无法print出@str正式表格在没有行转列之前是可以显示出数据的,表格有数据!!请问 上面写法 正式数据表需要什么注意的吗?或修改些写法?
      

  4.   

    现在问题描述:
    在上面的临时表是可以的print出@str,到了正式表格什么也不显示了   
    也无法print出@str正式表格在没有行转列之前是可以显示出数据的,表格有数据!!请问 上面写法 正式数据表需要什么注意的吗?或修改些写法?--------------------------------------------------------
    你不给脚本,也不给数据
    别人怎么帮你看呢
    总之测试脚本和测试数据都没有问题
      

  5.   

    在没有转之前代码select A.MachineCavType,sum(A.SubpoenaNo) as K_NGNO from dbo.NGK_SubpoenaInfo as A
    inner join dbo.K_Subpoena as B
    on A.KSubpoenaID=B.pid
    where B.PartCode='LL0779001' and 
    B.HappenDate between '2011-03-14 00:00:00.000' and '2011-03-18 00:00:00.000' 
    and B.CheckState='已判定' and B.VendCode='L5DCHPXJ'
    group by A.MachineCavType order by K_NGNO desc
    效果:
    MachineCavType                                     K_NGNO
    -------------------------------------------------- -----------
    c#                                                 74
    A#                                                 17
    E#                                                 14
    D#                                                 13
    B#                                                 5(5 row(s) affected)现在 行转列:declare @str varchar(8000)
    --declare @sql varchar(8000)
    set @str=''select @str=@str+','+'sum(case when MachineCavType='''+MachineCavType+''' then SubpoenaNo else 0 end)['+MachineCavType+']' 
          from dbo.NGK_SubpoenaInfo  group by MachineCavTypeprint(@str)set @str='select ''不良数量'' as [不良模号/机台号]'+@str+' from dbo.NGK_SubpoenaInfo A inner join dbo.K_Subpoena B on A.KSubpoenaID=B.pid where B.PartCode=''LL0779001''
              and b.HappenDate between ''2011-03-14 00:00:00.000'' and ''2011-03-18 00:00:00.000'' and B.CheckState=''已判定'' and B.VendCode=''L5DCHPXJ'''exec (@str)
    正式表测试用的
    主表:dbo.K_Subpoena-->就是 #tb1
    VendCode           --->#tb1 供应商
    PartCode           --->#tb1 部品
    CheckState         --->#tb1 确认
    HappenDate        --->#tb1  订单时间关联表:dbo.NGK_SubpoenaInfo   就是 #tb2
    字段 KSubpoenaID  --->#tb2 tb1ID   (关联 主表dbo.K_Subpoena)
    MachineCavType  --->#tb2  模具类型 由于数据比较多 所以...不知道如何说明 不提示错误 也不返回任何值....奇怪了请大侠 认为那里出了问题
     
      

  6.   

    dbo.NGK_SubpoenaInfo   字段 SubpoenaNo  相当于 是#tb2 数量
      

  7.   

    把你值得怀疑的字符串都isnull(@str,'')
    一行一行打印
      

  8.   

    isnull(MachineCavType,'000001')
    isnull(MachineCavType,'000002')
      

  9.   

    模具类型 MachineCavType  40多万行  基本都是空的 有10多条才有值的~~~ 不知道是否有关系~~  谢谢各位 我再看看先 
      

  10.   


    declare @str varchar(8000)set @str=''
    select @str=@str+','+'sum(case when MachineCavType='''+isnull(MachineCavType,'')+''' then isnull(SubpoenaNo,0) else 0 end)['+isnull(MachineCavType,'')+']' 
          from dbo.NGK_SubpoenaInfo  group by MachineCavTypeset @str='select ''不良数量''  [不良模号/机台号]'+@str+' from dbo.NGK_SubpoenaInfo A inner join dbo.K_Subpoena B on A.KSubpoenaID=B.pid where B.PartCode=''LL0779001''
              and b.HappenDate between ''2011-03-14 00:00:00.000'' and ''2011-03-18 00:00:00.000'' and B.CheckState=''已判定'' and B.VendCode=''L5DCHPXJ'''
    --print(@str)exec (@str)
    加了ISNULL 后就可以print(@str)出数据...
    可是全部运行则:提示:Msg 1038, Level 15, State 3, Line 1
    不能使用空白的对象或列名。如果必要,请使用一个空格。
    Msg 1038, Level 15, State 3, Line 1
    不能使用空白的对象或列名。如果必要,请使用一个空格。
    Msg 1038, Level 15, State 3, Line 1
    不能使用空白的对象或列名。如果必要,请使用一个空格。估计是哪里搞错了~~~是空值的原因 (数据表有很多空值)如果修改呢
      

  11.   

    主表:create table #tb1 ---主表
    (
    id int,   ---主ID
    部品 nvarchar(50),
    供应商 nvarchar(50),
    确认 nvarchar(50),
    订单时间 datetime
    )
    insert into #tb1 select 2,'b2','G2','NG','2011-3-1'
    insert into #tb1 select 3,'b3','G3','OK','2011-3-2'
    insert into #tb1 select 4,'b2','G2','OK','2011-3-1'
    insert into #tb1 select 5,'b3','G5','OK','2011-3-5'
    insert into #tb1 select 6,'b2','G2','OK','2011-3-1'
    insert into #tb1 select 7,'b2','G2','OK','2011-3-4'
    go
    关联表:create table #tb2
    (
    id int,       
    tb1ID int,    ---#tb1 的主ID关联
    数量 int,
    模具类型 nvarchar(50)

    insert into #tb2 select 1,3,20,'A#'
    insert into #tb2 select 2,3,20,'A#'
    insert into #tb2 select 3,3,10,'B#'
    insert into #tb2 select 4,3,10,'B#'
    insert into #tb2 select 5,2,5,'C#'
    insert into #tb2 select 6,2,5,'C#'
    insert into #tb2 select 7,3,15,'D#'
    insert into #tb2 select 8,2,15,'D#'go
    普通:
    select A.模具类型,sum(A.数量) as K_NGNO from #tb2 as A
    inner join #tb1 as B
    on A.tb1ID=B.id
    where B.部品='b3' and A.模具类型<>'' and
    B.订单时间 between '2011-03-1 00:00:00.000' and '2011-03-6 00:00:00.000' 
    and B.确认='OK' and B.供应商='G3'
    group by A.模具类型 order by K_NGNO desc
    go效果
    模具类型                                               K_NGNO
    -------------------------------------------------- -----------
    A#                                                 40
    B#                                                 20
    D#                                                 15根据昨天的代码:(空值的问题解决了)
    现在才发现下面where后面的筛选条件去掉一样的获取的结果一样的,条件没有过滤成功....郁闷..
    请那位高人有时间看看 非常感谢!!
    declare @str varchar(max)
    set @str=''
    select @str=@str+','+'sum(case when 模具类型='''+模具类型+''' then 数量 else 0 end)['+模具类型+']' 
          from #tb2 group by 模具类型
    set @str='select ''数量'' as [模具类型]'+@str+' from #tb2 A inner join #tb1 B on A.tb1ID=B.id where B.部品=''b3''
              and b.订单时间 between ''2011-03-1 00:00:00.000'' and ''2011-03-6 00:00:00.000'' and B.确认=''OK'' and B.供应商=''G3'''exec (@str)
      

  12.   

    效果模具类型 A#          B#          C#          D#
    ---- ----------- ----------- ----------- -----------
    数量   40          20          0           15
    条件没有过滤成功:需要的效果:
    模具类型 A#          B#              D#
    ---- ----------- -----------  -----------
    数量     40          20              15