昨天我发了一贴:
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
那位大侠 遇到过这样的情况 告诉下 不知道如何描述了谢谢!!
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
那位大侠 遇到过这样的情况 告诉下 不知道如何描述了谢谢!!
你说了半天为什么不把你出问题的正式表的脚本帖出来??
在上面的临时表是可以的print出@str,到了正式表格什么也不显示了
也无法print出@str正式表格在没有行转列之前是可以显示出数据的,表格有数据!!请问 上面写法 正式数据表需要什么注意的吗?或修改些写法?
在上面的临时表是可以的print出@str,到了正式表格什么也不显示了
也无法print出@str正式表格在没有行转列之前是可以显示出数据的,表格有数据!!请问 上面写法 正式数据表需要什么注意的吗?或修改些写法?--------------------------------------------------------
你不给脚本,也不给数据
别人怎么帮你看呢
总之测试脚本和测试数据都没有问题
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 模具类型 由于数据比较多 所以...不知道如何说明 不提示错误 也不返回任何值....奇怪了请大侠 认为那里出了问题
一行一行打印
isnull(MachineCavType,'000002')
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
不能使用空白的对象或列名。如果必要,请使用一个空格。估计是哪里搞错了~~~是空值的原因 (数据表有很多空值)如果修改呢
(
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)
---- ----------- ----------- ----------- -----------
数量 40 20 0 15
条件没有过滤成功:需要的效果:
模具类型 A# B# D#
---- ----------- ----------- -----------
数量 40 20 15