数据库中有以下的一个表
通知号   工序号    生产数
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 
.
.
.
给点思路

解决方案 »

  1.   

    select 通知号  ,case 工序号=‘工序1’ then sum(生产数),......;
      

  2.   

    呵呵, ERP?
    首先得明确一下:"这些工序号从另一张表中检索出来的"是什么意思?是有另一张码表记录了
    工序1,工序2,工学3...还是动态的检索你列举的第一个表select distinct(工序号)?
      

  3.   

    是动态的检索你列举的第一个表select distinct(工序号)
    所以说麻烦事就在这儿
    DATAGRID的表头那些工序是动态地从数据库中检索出来的
      

  4.   

    用套帐关系去取所属值,重构DATATABLE,如果猜的不错的话,每个字段的类型的长度应该也在不同的表中.表应该是继承权限表
      

  5.   

    愚见:如果服务器能承受的话, 可以在存储过程里处理;
    否则, 若是C/S的话,可以把数据下载到客户端在Dataset里面处理._________________
    我的方法效率可能不会很高, 想听听seaonce(雨花中的小皮鞋)的方法先?
      

  6.   

    --预备建表
    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)
      

  7.   

    google之 keyword is "动态交叉表查询"
      

  8.   

    这个做法有问题。取出来是所有的,不是group by 通知号的
      

  9.   

    楼上svevx() 理解有误, 因为每个通知号的所有记录都反应到对应的一行里面去了,所以每个通知号只有一行,所以Group By是可以的.
      

  10.   

    看我的结果:
    通知号         工序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.通知号会有值传入吗?
      

  11.   

    重新排一下:
    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 通知号
      

  12.   

    a.通知号怎么不会传入了? 试运行以下:select 通知号,
    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里面没有记录时就显示其工具号, 有误?
      

  13.   

    当一个通知号在BBB里面没有记录时结果中对应的工序号就显示其通知号,sorry
      

  14.   

    这里工序的数量是未知的
    完全是从另一个表中select distinct(工序名称)来的
      

  15.   

    flyzq()的方法是可以的,你试试呗
      

  16.   

    to:svevx() 
    我不想去返工再去插入一张表
      

  17.   

    to 楼主:flyzq()方法中建的表BBB是作试验用的, 你只需要改下列语句就okdeclare @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)________________________注意把BBB改成你的表名就好, 不用"返工再去插入一张表"
      

  18.   

    感觉@col 500可不可能不够?万一工序号比较多怎么办?
    即使
    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)
    也有超出的可能。感觉还不是很稳妥,虽然功能实现了!
      

  19.   

    to:Mark2Win(马客)
    先去试试看PS:这是在存储过程中的吗?
        以前没怎么用过存储过程
       懂点语法
       说错了不要怪小弟
      

  20.   

    又是交叉表问题,lz可以检索一下,很多的,
    flyzq() ( ) 信誉:100 已经可以了
      

  21.   

    to 楼主:flyzq()方法中建的表BBB是作试验用的, 你只需要改下列语句就okdeclare @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)________________________注意把BBB改成你的表名就好, 不用"返工再去插入一张表"
    =====================================================================
    这样就解决楼主问题了
      

  22.   

    这种问题在Sql Server版问过一千遍了,如果上面还没有好的答案,建议楼主搜索一下以前的帖。
    CSDN论坛浏览器:浏览、发帖、回复、结贴自动平均给分,下载地址:http://CoolSlob.ys168.com
      

  23.   

    基本上明白了
    但是执行存储过程后能把这个结果赋值给DATATABLE吗?
    还要和DATAGRID邦定呢
      

  24.   

    感觉@col 500可不可能不够?万一工序号比较多怎么办?恩, 是的, 我算了一下, 如果使用varchar(8000),应该可以允许100个工序_____________________________________________
    楼主判断一下, 若工序在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
      

  25.   

    谢谢各位
    正在写procdure
    马上给分
    另感谢2Win的耐心和各位的帮助
    理解了动态交叉表的原理了