Inventory存货表中定义了每个存货的加工属性
如:
名称    数车加工   加工中心   去毛   气试
A          是          否       是    是
然后用SQL语句调出加工工序为“是”的工序名称,并分行在DGGrid中显示。
按照上面的数据在DBGrid中显示为:
A       数车加工
A       去毛
A       气试我试了好多方法都不行,各位大侠帮忙啊。   

解决方案 »

  1.   

    select 名称,'数车加工' from Inventory where 数车加工='是'
    union
    select 名称,'加工中心' from Inventory where 去毛='加工中心'
    union
    select 名称,'去毛' from Inventory where 去毛='是'
    union
    select 名称,'气试' from Inventory where 气试='是'类似于这样子的
    最后可以  order by 名称    一下
      

  2.   


    drop table ta
    create table ta(名称 varchar(1),数车加工 varchar(2),加工中心 varchar(2),去毛 varchar(2),气试 varchar(2))
    insert into ta 
    select 'A','是','否','是','是'  
    --union all  
    --select 'B','是','是','否','否'select * from ta--SQL SERVER 2000 静态SQL
    select * from
    (
    select 名称, 类别 = '数车加工' , 选项 = 数车加工 from ta 
    union all
    select 名称, 类别 = '加工中心' , 选项 = 加工中心 from ta
    union all
    select 名称, 类别 = '去毛' , 选项 = 去毛 from ta
    union all
    select 名称, 类别 = '气试' , 选项 = 气试 from ta
    ) t
    order by 名称 , case 类别 when '数车加工' then 1 when '加工中心' then 2 when '去毛' then 3 when '气试' then 4 end
    --SQL SERVER 2000 动态SQL。
    --调用系统表动态生态。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + ' union all ' , '' ) + ' select 名称 , [类别] = ' + quotename(Name , '''') + ' , [选项] = ' + quotename(Name) + ' from ta'
    from syscolumns 
    where name<> '名称' and ID = object_id('ta')
    order by colid ascexec(@sql + ' order by 名称 ')
    得到的结果集再次按照是否过滤一下就是你想要的
      

  3.   

    感覺大家解決問題一昧以 SQL 的思路似乎不正確...像是在擠牙膏@@通常遇到這樣的問題需以排版的手法來處理...先動態產生一個 TClientDataSet...在增添幾個對應的字段後再將數據填入......
      

  4.   

    不知道你是单纯为了那么显示下,还是还想在DBGRID里面继续有别的操作。如果只单纯显示下的话,用StringGrid操作更加简单方便,AdoQuary查询出来,然后按你要求的格式,FOR循环填表操作一样,也不用写那么复杂的SQL。
      

  5.   

    不是所用问题都只有SQL语句一种实现方法,换种方式也更能开阔你的思路,新手未必能想得出那样的SQL实现方法的。
      

  6.   

    这是最简单和通用的方法
    您是以 SQL Server 舉的例子~ 請問若用在 ADO 也可以這樣做嗎? 先謝了!
      

  7.   

    这是最简单和通用的方法
    您是以 SQL Server 舉的例子~ 請問若用在 ADO 也可以這樣做嗎? 先謝了!
    完全可以的,做成存储过程,然后用TADOStoredProc或ADODataSet调用这个过程就行了
    当然因为你指定要用DGGrid,所以这个方法是首选,如果换成StringGrid的话,也可以用Delphi前端去处理
      

  8.   


    得到相应的需加工工序后,双击Grid返回文本框,在加工进度表中录入对应的合格数量。
      

  9.   

    select 名称,'数车加工' as T_NAME from Inventory where 数车加工='是'
    union
    select 名称,'加工中心'as T_NAME from Inventory where 去毛='加工中心'
    union
    select 名称,'去毛'as T_NAME from Inventory where 去毛='是'
    union
    select 名称,'气试' as T_NAME from Inventory where 气试='是'
      

  10.   


    大概定义了20几个加工工序,我不知道要多少查几次啊。
    =================================================
    我上面不是提供了动态SQL语句吗,你有100个工序都可以
      

  11.   

    把“类别”换成“工序”,用动态SQL方法
      

  12.   


    我想得到的是如果
    A   的加工工序为是的,则显示如下:DBGrid中显示为
    名称    加工工序名称
    A       数车
    A       气试
    A       去毛并不是得到列的内容。
    另外每个存货的加工属性不一样,我只是举例一个。
      

  13.   

    把“类别”换成“工序”,用动态SQL方法呵呵,水平有限啊,没有学过SQL,我得好好研究一下。
      

  14.   

    把“类别”换成“工序”,用动态SQL方法我可以把数据库发给你么?这样你就可以看到我的结构,帮写一个表达式。
      

  15.   

    这是最简单和通用的方法
    您是以 SQL Server 舉的例子~ 請問若用在 ADO 也可以這樣做嗎? 先謝了!
    完全可以的,做成存储过程,然后用TADOStoredProc或ADODataSet调用这个过程就行了
    当然因为你指定要用DGGrid,所以这个方法是首选,如果换成StringGrid的话,也可以用Delphi前端去处理
    學習了! 非常感謝您喔~ 
      

  16.   

    create table a (   名称 varchar(50),   数车加工  varchar(50),   加工中心  varchar(50),   去毛  varchar(50),   气试  varchar(50),   )   
    insert into a values('A','是','否','是','是');  
    --select * from a 
    create table new_a (   名称 varchar(50),   加工方式  varchar(50),是否 varchar(50) ); declare @sql varchar(8000)
    select @sql = isnull(@sql + ' union all ' , '' )
    + ' select 名称 , [加工方式] = ' 
    + quotename(Name , '''')  
    + ' , [是否] = ' + quotename(Name) + ' from a '
    from syscolumns 
    where name<> N'名称' and ID = object_id('a') 
    order by colid asc
    --exec(@sql )
    insert into new_a exec(@sql) 
    select 名称,加工方式 from new_a where 是否='是'
    drop table a ,new_a