第一問題:
一個表:
F1    F2    F3    F4    F5
jack      book1     book2     book3
mary      book4     book5
billy     book6     book7
...要把它轉換成這樣的形式
F1      F2
jack    book1
jack    book2
jack    book3
mary    book4
mary    book5
...第二個問題:
把上面的兩個形式倒著轉換...

解决方案 »

  1.   

    1
    SELECT F1,F2 FROM T1
      UNION
    SELECT F1,F3 FROM T1
      UNION
    SELECT F1,F4 FROM T1
      UNION
    SELECT F1,F5 FROM T1
    2向回转没想到好的语句,建议用计算字段
      

  2.   

    select f1,f2 from z
    union select f1,f3 from z 
    union select f1,f4 from z
      

  3.   

    [email protected]
    謝謝一樓的
      

  4.   


    回复人: sunvsh(sunv) ( ) 信誉:100 
    我的信譽確實很低,可能是因為我去年的貼沒有些沒有結吧,有一段時間我去外地出差幾個月都沒上csdn
    後來論壇裡的資料被清 ,木有辦法。不想換ID。
    我現在的發貼數是25貼,2貼未結。這兩貼都是這兩天剛發的呢。
      

  5.   

    下面是我的一个例子,看看是不是与你的要求一样:create table xhh1(fid varchar(10),f1 varchar(10),f2 varchar(10),f3 varchar(10))
    insert xhh1
    select 'abc','sdfs','asdf','etre'
    union all
    select 'def','sdfs','asdf','etre'declare @sql varchar(8000)
    set @sql=''
    select @sql=@sql+' union all select fid,'+name +' from xhh1 ' from syscolumns where id=(select id from sysobjects where name='XHH1' )
    print right(@sql,len(@sql)-9 ) select fid,f1 from xhh1  union all select fid,f2 from xhh1  union all select fid,f3 from xhh1  union all select fid,fid from xhh1 
    --------------------------
    fid        f1         
    ---------- ---------- 
    abc        sdfs
    def        sdfs
    abc        asdf
    def        asdf
    abc        etre
    def        etre
    abc        abc
    def        def(所影响的行数为 8 行)
      

  6.   

    矩阵转换? 学习ing
    楼主 能不能把 wychero(高天) 发的贴上来看看 谢谢!
      

  7.   

    航 列相互轉化呀 利用Case 轉化吧
    缺點 列不能超過255個
    用存儲過程可以實現自動轉化
      

  8.   

    F1    F2    F3    F4    F5
    jack      book1     book2     book3
    mary      book4     book5
    billy     book6     book7
    --------------------------------------------------为什么很多人都喜欢设计这样的表,真是不解
      

  9.   

    第一個問題很easy 的解決了。
    第二個問題還是不懂。
    樓上的講清楚些吧,怎麼用case when ?轉換
    我想了一個法子解決,但十分麻煩。
    select distinct A.name,
    (select min(B.book) from book1 B where B.name=A.name ) as F1,
    (select min(C.book) from book1 C where  C.name=A.name and C.book<> (select min(D.book) from book1 D where D.name=A.name ) ) as F2
     from book1 A
    上面的語句裡面選取F2字段部分不能直接引用C.book<>F1,而只能重復一遍選取F1字段的操作。
    這樣的話F3字段又要多重復一遍
    應該有更好的辦法吧? jinjazz(人雅的标记--落寞刺客) ( ) 信誉:109 
    這種表也不一定沒它的用武之地吧
    ps 這個也不是我設計的表,別人給我提的問題罷了。
      diablo2還有玩麼?現在1.10綠套裝幾乎全部淪為lj了
      

  10.   

    diablo2還有玩麼?現在1.10綠套裝幾乎全部淪為lj了
    ------------------------------------------------------------
    我在109的时候就已经退役了,呵呵。那时候这个东西还卖了15sc(A3),没多久就遭遇了dupe大潮,很多土豪都一夜破产,我还是幸运的,都换成了rmb
      

  11.   

    create table Test
    (F1 char(10),
     F2 char(10))--测试表insert into Test 
    select 'jack' F1,'book1' F2
    union
    select 'jack' F1,'book2' F2
    union
    select 'jack' F1,'book3' F2
    union
    select 'Mary' F1,'book4' F2
    union
    select 'Mary' F1,'book5' F2
    union
    select 'Mike' F1,'book1' F2
    union
    select 'Mike' F1,'book5' F2
    union
    select 'Mike' F1,'book7' F2
    union
    select 'Mike' F1,'book9' F2--插入数据select id=identity(int,0,1),f1,f2 into #t from test
    select a.f1,a.f2,N=
     case when (id>cc) then cast(id-cc as Char(10))
          when (id<=cc) then cast(id+1 as Char(10))
     end
    into #Temp
    from #t a,
    (select f1,cc  from 
      (select  f1,count(*)as cc from test group by f1) t)b
    where a.f1=b.f1
    --构造两个临时表,由于要用到行号,所以必须要第一个临时表,第二个可以不用select * from #Temp--这个表笔原来的多一个字段,每个人的第n条记录DECLARE @SQL VARCHAR(8000)
    SET @SQL='SELECT f1  姓名'
    SELECT @SQL= @SQL+ ',MIN(CASE WHEN N = ''' + N + ''' THEN F2 END) [F' + N + ']' FROM (SELECT DISTINCT N FROM #Temp) A
    SET @SQL=@SQL+' FROM #Temp GROUP BY F1'
    EXEC (@SQL)
     
    --一条动态SQL语句drop table #t
    drop table #Temp
    drop table Test
    /*
    jack       book1      1         
    jack       book2      2         
    jack       book3      3         
    Mary       book4      1         
    Mary       book5      2         
    Mike       book1      1         
    Mike       book5      2         
    Mike       book7      3         
    Mike       book9      4         
    --------Temp表数据*//*
    jack       book1      book2      book3      NULL
    Mary       book4      book5      NULL NULL
    Mike       book1      book5      book7      book9     --------最终结果*/
      

  12.   

    第二题答案如上,直接copy到SQLServer的查询分析器测试运行
      

  13.   

    第一个例子用联合查询是可以实现的
    至于第二个例子嘛,就必须使用Transform 语句来实现
    该语句能够使表的部分行变成列!
    如需要可与我联系,提供资料!
    [email protected](许先生)
      

  14.   

    呵呵,楼上说的也是,如果是Access就可能用到Transform了,不过个人觉得access中很难实现非固定行来做交叉表的
      

  15.   

    只能在Access中,SQLServer没有
    ---------------------------------
    TRANSFORM 语句通常用于计算总数、平均值、数目以及其它对记录进行总体统计的算法。并在计算后把结果信息显示在一个格子或数据表中,其中的数据分别按照行和列排列。一个TRANSFORM 语句的一般形式如下:TRANSFORM aggregating function
    SELECT Statement
    PIVOT column heading field
    我们假设我们可以建立一个按照每一年为基础显示每个顾客的所有发票的数据表。这个列名应该是顾客的姓名,而行名则将是年份。让我们修改原来的SQL语句以符合转变后的语句.TRANSFORM
    IIF(Sum([Amount]) IS NULL,NONE,Sum([Amount]))
    AS Total
    SELECT [Last Name] & , & [First Name] AS Name
    FROM tblCustomers LEFT JOIN tblInvoices
    ON tblCustomers.CustomerID=tblInvoices.CustomerID
    GROUP BY [Last Name] & , & [First Name]
    PIVOT Format(InvoiceDate, yyyy)
    IN (1996,1997,1998,1999,2000)
    注意SUM函数是合计函数,组里的列的题头用在SELECT 语句的子句里,而行的名字由PIVOT关键字后所列出的域名决定。
      

  16.   

    我的测试有点错误,修改一下,中间部分替换为
    -----------------------------------------------select a.f1,a.f2,a.id,cc ,N=
     case when (id>cc) then cast(id-cc-minn+1 as Char(10))
          when (id<=cc) then cast(id+1 as Char(10))
     end
    into #Temp
    from #t a,
    (select f1,cc,minn  from 
      (select  f1,count(*)as cc,min(id)-count(*) as minn from #t group by f1) t)b
    where a.f1=b.f1
    --构造两个临时表,由于要用到行号,所以必须要第一个临时表,第二个可以不用
      

  17.   

    我觉得case是不可取的
    楼主的数据库是不是SQL Server?
    是不是支持你那个case函数?
    在回答问题是应该使用标准SQL-92。
      

  18.   

    --楼上的摆脱你测试一下
    create table Test
    (F1 char(10),
     F2 char(10))--测试表insert into Test 
    select 'jack' F1,'book1' F2
    union
    select 'jack' F1,'book2' F2
    union
    select 'jack' F1,'book3' F2
    union
    select 'Mary' F1,'book4' F2
    union
    select 'Mary' F1,'book5' F2
    union
    select 'Mike' F1,'book1' F2
    union
    select 'Mike' F1,'book5' F2
    union
    select 'Mike' F1,'book7' F2
    union
    select 'Mike' F1,'book9' F2--插入数据select id=identity(int,0,1),f1,f2 into #t from test
    select a.f1,a.f2,a.id,cc ,N=
     case when (id>cc) then cast(id-cc-minn+1 as Char(10))
          when (id<=cc) then cast(id+1 as Char(10))
     end
    into #Temp
    from #t a,
    (select f1,cc,minn  from 
      (select  f1,count(*)as cc,min(id)-count(*) as minn from #t group by f1) t)b
    where a.f1=b.f1select * from #Temp--这个表笔原来的多一个字段,每个人的第n条记录DECLARE @SQL VARCHAR(8000)
    SET @SQL='SELECT f1  姓名'
    SELECT @SQL= @SQL+ ',MIN(CASE WHEN N = ''' + N + ''' THEN F2 END) [F' + N + ']' FROM (SELECT DISTINCT N FROM #Temp) A
    SET @SQL=@SQL+' FROM #Temp GROUP BY F1'
    EXEC (@SQL)
     
    --一条动态SQL语句drop table #t
    drop table #Temp
    drop table Test