第一問題:
一個表:
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
...第二個問題:
把上面的兩個形式倒著轉換...
一個表:
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
...第二個問題:
把上面的兩個形式倒著轉換...
SELECT F1,F2 FROM T1
UNION
SELECT F1,F3 FROM T1
UNION
SELECT F1,F4 FROM T1
UNION
SELECT F1,F5 FROM T1
2向回转没想到好的语句,建议用计算字段
union select f1,f3 from z
union select f1,f4 from z
謝謝一樓的
回复人: sunvsh(sunv) ( ) 信誉:100
我的信譽確實很低,可能是因為我去年的貼沒有些沒有結吧,有一段時間我去外地出差幾個月都沒上csdn
後來論壇裡的資料被清 ,木有辦法。不想換ID。
我現在的發貼數是25貼,2貼未結。這兩貼都是這兩天剛發的呢。
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 行)
楼主 能不能把 wychero(高天) 发的贴上来看看 谢谢!
缺點 列不能超過255個
用存儲過程可以實現自動轉化
jack book1 book2 book3
mary book4 book5
billy book6 book7
--------------------------------------------------为什么很多人都喜欢设计这样的表,真是不解
第二個問題還是不懂。
樓上的講清楚些吧,怎麼用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了
------------------------------------------------------------
我在109的时候就已经退役了,呵呵。那时候这个东西还卖了15sc(A3),没多久就遭遇了dupe大潮,很多土豪都一夜破产,我还是幸运的,都换成了rmb
(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 --------最终结果*/
至于第二个例子嘛,就必须使用Transform 语句来实现
该语句能够使表的部分行变成列!
如需要可与我联系,提供资料!
[email protected](许先生)
---------------------------------
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关键字后所列出的域名决定。
-----------------------------------------------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
--构造两个临时表,由于要用到行号,所以必须要第一个临时表,第二个可以不用
楼主的数据库是不是SQL Server?
是不是支持你那个case函数?
在回答问题是应该使用标准SQL-92。
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