对数据库中的数据,我们在现实的时候经常会有一些比较特殊的要求,
例如 出报表的时候,需要把本来是3列的数据,按照不同的条数变成柳列来显示,如果用程序来实现这样的功能,一般都比较繁琐,并且效率也不是很高,如果使用SQL语句来完成的话,那么数据在一出来的时候就是我们想要的格式,岂不是很好。
下面就是两个比较特殊的实现
原始数据和表的结构如下
name | stuno | sex |
張三 | 001 | 男 |
李四 | 002 | 男 |
張艷 | 003 | 女 |
王一 | 004 | 男 |
王二 | 005 | 男 |
王艷 | 006 | 女 |
第一种实现,我们需要把一行数据变成两行,变成
张三
男
这样我们就可以在程序中用两行或者是个多的行,来表示数据库中的一条数据,这个方法在数据库中数据字段比较多的时候,可以用一个GRID来显示,实现的SQL语句如下:
select stuno,name from
(
select * from (select top 10000 stuno,[name],1 as [no] from tblStudent order by stuno) T
union all
select * from (select top 10000 stuno,[sex] as [name],2 as [no] from tblStudent order by stuno) T
) F
ORDER BY stuno,[no]
stuno | name |
001 | 張三 |
001 | 男 |
002 | 李四 |
002 | 男 |
003 | 張艷 |
003 | 女 |
004 | 王一 |
004 | 男 |
005 | 王二 |
005 | 男 |
006 | 王艷 |
006 | 女 |
第二种实现方法,将数据变成6列来表示
SELECT TOP 1 * from tblStudent A
LEFT JOIN (SELECT TOP 1 * FROM tblStudent WHERE (stuno NOT IN (SELECT TOP 2 stuno FROM tblStudent B))) D ON 1=1
LEFT JOIN (SELECT TOP 1 * FROM tblStudent WHERE (stuno NOT IN (SELECT TOP 4 stuno FROM tblStudent B))) E ON 1=1
UNION
SELECT TOP 1 * from tblStudent A
LEFT JOIN (SELECT TOP 1 * FROM tblStudent WHERE (stuno NOT IN (SELECT TOP 3 stuno FROM tblStudent B))) D ON 1=1
LEFT JOIN (SELECT TOP 1 * FROM tblStudent WHERE (stuno NOT IN (SELECT TOP 5 stuno FROM tblStudent B))) E ON 1=1
WHERE A.stuno not in (SELECT TOP 1 stuno from tblStudent)
实现后的大致效果如下:
張三 | 001 | 男 | 李四 | 002 | 男 |
張艷 | 003 | 女 | 王二 | 005 | 男 |
这两种方法,对于一些特殊要求的数据形式比较有用,希望可以对大家有所帮助。
实现环境:WinXP SP2
SQL Server 2000 Developer