数据库中有以下的一个表
通知号 工序号 生产数
2 工序1 20
2 工序2 21
2 工序4 22
3 工序1 54
3 工序5 51
。
。
我想在DATAGRID中显示如下
通知号 工序1 工序2 工序3 工序4。(这些工序号从另一张表中检索出来的)
2 20 21 0 22
3 54 0 0 0 51
.
.
.
给点思路
通知号 工序号 生产数
2 工序1 20
2 工序2 21
2 工序4 22
3 工序1 54
3 工序5 51
。
。
我想在DATAGRID中显示如下
通知号 工序1 工序2 工序3 工序4。(这些工序号从另一张表中检索出来的)
2 20 21 0 22
3 54 0 0 0 51
.
.
.
给点思路
解决方案 »
- 关于类里边方法作用域的问题
- 新手提问,两个textbox计算结果
- 这个问题是签名文件不匹配,还是什么,如何解决呢
- 100分求教Vs2005打包问题?
- 如何在水晶报表中使用[非数据库]数据源
- 如何动态改变窗体控件的大小???(datagrid和winform)
- 设备是wince系统,需要从上面下载文件,装了个ftp不支持pasv
- richbox中显示xml格式内容的问题
- <ado.net>怎样利用数据库名称得到数据库的架构,比如说表名?
- 如何将字符串转化成图片
- 关于在服务器上安装部署的时候dotnetfx.exe一起安装的问题,肯定做过的人相告,具体描述如下:(分不够再加)
- 用什么工具能在进行类设计时,使设计和C#的类的代码同步???
首先得明确一下:"这些工序号从另一张表中检索出来的"是什么意思?是有另一张码表记录了
工序1,工序2,工学3...还是动态的检索你列举的第一个表select distinct(工序号)?
所以说麻烦事就在这儿
DATAGRID的表头那些工序是动态地从数据库中检索出来的
否则, 若是C/S的话,可以把数据下载到客户端在Dataset里面处理._________________
我的方法效率可能不会很高, 想听听seaonce(雨花中的小皮鞋)的方法先?
create Table BBB
(
通知号 int,
工序号 nvarchar(10),
生产数 int
)
--填数据
insert into BBB (通知号,工序号,生产数)values(2,'工序1' ,20)
insert into BBB (通知号,工序号,生产数)values(2,'工序2' ,21)
insert into BBB (通知号,工序号,生产数)values(2,'工序4' ,22)
insert into BBB (通知号,工序号,生产数)values(3,'工序1' ,54)
insert into BBB (通知号,工序号,生产数)values(3,'工序3' ,55)
insert into BBB (通知号,工序号,生产数)values(3,'工序5' ,56)select * from BBBdeclare @col nvarchar(500)
declare @str nvarchar(1000)set @col=''select @col=@col+',isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='''+工序号+'''),0) as '+工序号+'' from BBB group by 工序号
select @str='select 通知号'+ @col+' from BBB a group by 通知号'exec(@str)
通知号 工序1 工序2 工序3 工序4 工序5
----------- ----------- ----------- ----------- ----------- -----------
2 148 42 55 44 107
3 148 42 55 44 107
很显然在col中a.通知号是无法获取的。
最后执行的语句str是:
select 通知号,isnull((select sum(生产数) from A where 通知号=a.通知号 and 工序号='工序1'),0) as 工序1,isnull((select sum(生产数) from A where 通知号=a.通知号 and 工序号='工序2'),0) as 工序2,isnull((select sum(生产数) from A where 通知号=a.通知号 and 工序号='工序3'),0) as 工序3,isnull((select sum(生产数) from A where 通知号=a.通知号 and 工序号='工序4'),0) as 工序4,isnull((select sum(生产数) from A where 通知号=a.通知号 and 工序号='工序5'),0) as 工序5
from BBB a group by 通知号
可以看到中间结果集是单独计算的,这个a.通知号会有值传入吗?
select 通知号,
isnull((select sum(生产数) from A where 通知号=a.通知号 and 工序号='工序1'),0) as 工序1,
isnull((select sum(生产数) from A where 通知号=a.通知号 and 工序号='工序2'),0) as 工序2,
isnull((select sum(生产数) from A where 通知号=a.通知号 and 工序号='工序3'),0) as 工序3,
isnull((select sum(生产数) from A where 通知号=a.通知号 and 工序号='工序4'),0) as 工序4,
isnull((select sum(生产数) from A where 通知号=a.通知号 and 工序号='工序5'),0) as 工序5
from BBB a group by 通知号
isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='工序1'),a.通知号) as 工序1,
isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='工序2'),a.通知号) as 工序2,
isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='工序3'),a.通知号) as 工序3,
isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='工序4'),a.通知号) as 工序4,
isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='工序5'),a.通知号) as 工序5,
isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='工序8'),a.通知号) as 工序8
from BBB a group by 通知号_________________
当一道工序在BBB里面没有记录时就显示其工具号, 有误?
完全是从另一个表中select distinct(工序名称)来的
我不想去返工再去插入一张表
declare @str nvarchar(1000)set @col=''select @col=@col+',isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='''+工序号+'''),0) as '+工序号+'' from BBB group by 工序号
select @str='select 通知号'+ @col+' from BBB a group by 通知号'exec(@str)________________________注意把BBB改成你的表名就好, 不用"返工再去插入一张表"
即使
declare @col nvarchar(4000)set @col=''select @col=@col+',isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='''+工序号+'''),0) as '+工序号+'' from BBB group by 工序号
select @col='select 通知号'+ @col+' from BBB a group by 通知号'exec(@col)
也有超出的可能。感觉还不是很稳妥,虽然功能实现了!
先去试试看PS:这是在存储过程中的吗?
以前没怎么用过存储过程
懂点语法
说错了不要怪小弟
flyzq() ( ) 信誉:100 已经可以了
declare @str nvarchar(1000)set @col=''select @col=@col+',isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='''+工序号+'''),0) as '+工序号+'' from BBB group by 工序号
select @str='select 通知号'+ @col+' from BBB a group by 通知号'exec(@str)________________________注意把BBB改成你的表名就好, 不用"返工再去插入一张表"
=====================================================================
这样就解决楼主问题了
CSDN论坛浏览器:浏览、发帖、回复、结贴自动平均给分,下载地址:http://CoolSlob.ys168.com
但是执行存储过程后能把这个结果赋值给DATATABLE吗?
还要和DATAGRID邦定呢
楼主判断一下, 若工序在100个以内, 那么在查询分析器里运行以下:Create proc SP_GX
as
Begin
declare @col varchar(8000)
declare @str varchar(8000)set @col=''select @col=@col+',isnull((select sum(生产数) from BBB where 通知号=a.通知号 and 工序号='''+工序号+'''),0) as '+工序号+'' from BBB group by 工序号
select @str='select 通知号'+ @col+' from BBB a group by 通知号'exec(@str)
End
Go
-存储过程到此
___________________________-调用改存储过程, 输入
SP_GX
Go
-或者
Exec SP_GX
Go
正在写procdure
马上给分
另感谢2Win的耐心和各位的帮助
理解了动态交叉表的原理了