id   filedName    sjName   FieldValue   file_id
1      年           year     2009         8d571fc
2      月           month    10           8d571fc
3      日            day     9            8d571fc
4     发行部门      fxbm     船体         8d571fc       我想用视图来写,实现year month day  fxbm   id   
                    2009  10    9   船体 8d571fc
注意:FieldValue 里面的值 还有file_id  的 是会改变的

解决方案 »

  1.   


    --> 测试数据:[TB]
    if object_id('[TB]') is not null drop table [TB]
    create table [TB]([id] int,[filedName] varchar(8),[sjName] varchar(5),[FieldValue] varchar(4),[file_id] varchar(7))
    insert [TB]
    select 1,'年','year','2009','8d571fc' union all
    select 2,'月','month','10','8d571fc' union all
    select 3,'日','day','9','8d571fc' union all
    select 4,'发行部门','fxbm','船体','8d571fc'select * from [TB]declare @s nvarchar(4000)
    Select @s=isnull(@s+',','')+quotename([sjName])+'=max(case when [sjName]='+quotename([sjName],'''')+' then [FieldValue] else '''' end)'
    from TB group by [sjName] 
    exec('select '+@s+' ,[file_id] from TB group by [file_id]')/*
    day  fxbm month year file_id
    ---- ---- ----- ---- -------
    9    船体   10    2009 8d571fc(1 行受影响)
    */
    drop table TB
      

  2.   

    我知道是行转列,考虑本身的表用select 查询 显示出的数据
    id  filedName    sjName  FieldValue  file_id 
    1      年          year    2009       8d571fc 
    2      月          month    10        8d571fc 
    3      日            day    9          8d571fc 
    4    发行部门      fxbm    船体         8d571fc
    是这样的,肯定是要用动态的来写,这个没有写过      
      

  3.   

    ------------------------------------------------------------------------
    -- Author : HappyFlyStone 
    -- Date   : 2010-01-03 21:23:10
    -- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) 
    --       Apr 14 2006 01:12:25 
    --       Copyright (c) 1988-2005 Microsoft Corporation
    --       Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
    --      
    -------------------------------------------------------------------------- Test Data: ta
    IF OBJECT_ID('[ta]') IS NOT NULL 
        DROP TABLE [ta]
    Go
    CREATE TABLE ta([id] INT,[filedName] NVARCHAR(4),[sjName] NVARCHAR(5),[FieldValue] varchar(10),[file_id] NVARCHAR(7))
    Go
    INSERT INTO ta
       SELECT 1,'年','year','2009','8d571fc' UNION ALL
       SELECT 2,'月','month','10','8d571fc' UNION ALL
       SELECT 3,'日','day','9','8d571fc' UNION ALL
       SELECT 4,'发行部门','fxbm','船体','8d571fc' UNION ALL
       SELECT 1,'年','year','2009','8d571fd' UNION ALL
       SELECT 2,'月','month','10','8d571fd' UNION ALL
       SELECT 3,'日','day','9','8d571fd' UNION ALL
       SELECT 4,'发行部门','fxbm','船体','8d571fd' 
    GO
    --Start
    SELECT
        max(case when sjName = 'year' then [FieldValue] else '' end) as [year],
        max(case when sjName = 'month' then [FieldValue] else '' end) as [month],
        max(case when sjName = 'day' then [FieldValue] else '' end) as [day],
        max(case when sjName = 'fxbm' then [FieldValue] else '' end) as [fxbm],
        [file_id]
    from ta 
    group by [file_id]
     --Result:
    /*year       month      day        fxbm       file_id
    ---------- ---------- ---------- ---------- -------
    2009       10         9          船体         8d571fc
    2009       10         9          船体         8d571fd(2 行受影响)*/
    --End 
      

  4.   

    sjName 又 不变,搞什么动态
      

  5.   

    试了下,到具体的就不行了,我给的只是部分字段,还有很多的,不可能每一个都用union all 来吧,
    fieldname 和sjName字段里面的只是不会变的,而FieldValue 和 FILE_ID 中的值是会改变的
      

  6.   

    用静态SQL即可,不需要动态.4楼石头的语句即可。
    至于你说的:而FieldValue 和 FILE_ID 中的值是会改变的,石头的语句就是针对这两个字段的值是变的.要不变才麻烦了.