现在我要实现的 软件的功能是 有一个产品 要经过15道工序 每道工序有相应的数据写入数据库 现在我要查询 该产品 已经经过了几道工序 并且 各历史工序的 信息
比如说   
  产品的ID  A  B  C   D   E      F     G   为列名 代表各个工序,当进行到工序D的时候 E F G均为NULL
     123    1  1  1   1  NULL  NULL   NULL
想要的查询结果是:
产品ID   A     B       C       D
123      1     1       1       1
求大神们帮忙啊SQL   MFC  SQL数据库软件c++

解决方案 »

  1.   


    WITH a1 (ID,A,B,C,D,E,F,G) AS
    (
     SELECT 123,1,1,1,1,NULL,NULL,NULL
    )
    ,a2 AS
    (
    SELECT ID,'A' NAME,A VALUE FROM a1
    UNION ALL
    SELECT ID,'B',B FROM a1
    UNION ALL
    SELECT ID,'C',C FROM a1
    UNION ALL
    SELECT ID,'D',D FROM a1
    UNION ALL
    SELECT ID,'E',E FROM a1
    UNION ALL
    SELECT ID,'F',F FROM a1
    UNION ALL
    SELECT ID,'G',G FROM a1
    )
    SELECT * INTO #cu1 FROM a2 NAME WHERE VALUE IS NOT NULLselect distinct NAME into #cu2 from #cu1declare @sql varchar(max),@sql2 varchar(max)
    select @sql = isnull(@sql + '],[' , '') + NAME from #cu2
    set @sql = '[' + @sql + ']'
    select @sql2 = isnull(@sql2 + ',' , ',') + 'isnull(['+NAME+'],0) ['+NAME+']' from #cu2
    set @sql='select ID'+@sql2+' from #cu1 a pivot (MAX(VALUE) for NAME in (' + @sql + ')) b order by ID'
    exec (@sql)
      

  2.   

    if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
    CREATE TABLE #temp(id INT, A INT, B INT, C INT , D INT, E INT ,F INT, G INT)
    insert #temp
    select '123',1,1,1,1,NULL, NULL,NULLDECLARE @fieldlist NVARCHAR(200), @sql NVARCHAR(MAX)
    SET @fieldlist = STUFF(
    (
    SELECT (','+QUOTENAME(B.工序名称))
    FROM #TEMP A
    UNPIVOT
    (值 FOR 工序名称 IN([A],[B],[C],[D],[E],[F],[G])) B --这儿楼主自己补齐了
    FOR XML PATH('')
    ),1,1,''
    )SET @sql = N'
    SELECT *
    FROM #TEMP A
    UNPIVOT
    (值 FOR 工序名称 IN([A],[B],[C],[D],[E],[F],[G])) B --这儿楼主自己补齐了
    PIVOT
    (MAX(值) FOR 工序名称 IN('+ @fieldlist +')) C
    '
    --PRINT @sql
    EXEC (@SQL)
    /*
    id A B C D
    123 1 1 1 1
    */