易截截图软件、单文件、免安装、纯绿色、仅160KB

sql server和oracle行转列的一种典型方法

sql server和oracle行转列的一种典型方法
前言:网上有不少文章是讲行转列的,但是大部分都是直接贴代码,忽视了中间过程,本人自己思考了下为什么要这样实现,并且做了如下的笔记,对有些懂的人来说可能没有价值,希望对还不懂的人有一点借鉴意义。
对于有些业务来说,数据在表中的存储和其最终的Grid表现恰好相当于把源表倒转,那么这个时候我们就碰到了如何把行转化为列的问题,为了简化问题,我们且看如下查询出来的数据,您不必关心表的设计以及sql语句:

假设用到的sql语句为:
SELECT [姓名],[时代],[金钱]
  from [test].[dbo].[people]  
这个表存储了两个人在不同时代(时代是固定的三个:年轻、中年和老年)拥有的金币,其中:
张三在年轻、中年和老年时期分别拥有1000、5000、800个金币;
李四在年轻、中年和老年时期分别拥有1200、6000、500个金币。
现在我们想把两人在不同阶段拥有的金币用类似如下的表格来展现:
姓名
年轻
中年
老年
张三
1000
5000
800
李四
1200
6000
500
我们现在考虑用最简单和直接的办法来实现,其实关键是如何创建那些需要增加的列,且如何设定其值,现在我们来创建“年轻”列,关键的问题是,这一列的值如何设定?合法的逻辑应该是这样:如果该行不是“年轻”时代,那么其“金钱”我们认为是0,那么sql语句如何写呢?
如果是用的sql server,那么肯定要用到case了:
case  [时代] when '年轻' then [金钱] else 0 end as 年轻

case when  [时代]= '年轻' then [金钱] else 0 end as 年轻
如果用的是oracle,那么要用到decode函数,decode(1+1,3,'错',2,'是',5,'错','都不满足下返回的值'),这个函数将返回“是”,具体用法限于篇幅这里不再介绍,相信大家从这个式子可以大概了解到其意思,用decode创建“年轻”列的句子是:完整的sql语句如下所示:
decode(时代,'年轻',金钱,0)) 年轻
SELECT [姓名],[时代],[金钱], 
case  [时代] when '年轻' then [金钱] else 0 end as 年轻,
case  [时代] when '中年' then [金钱] else 0 end as&nb


相关文档:

oracle数据库导进ACEESS的方法

 2010年2月3日,本人有一個興奮的小發現,实验证明,直接用TOAD将oracle数据库中的数据直接导入
ACCESS中是不可能的。那為了做到从TOAD中将数据导入ACCESS运用间接渠道。可以用文本文件或xls等文件。其实最令我感到惊喜的是,我是通过sql 2000作為一个间接的中介,因Ġ ......

JDBC存取ORACLE大型数据对象LOB几种情况的示范类

      import Java.io.*;
  import java.util.*;
  import java.sql.*;
  public class LobPros
  {
  /**
  * Oracle驱动程序
  */
  private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
  /**
  * ORACLE连接用URL
  */
  p ......

三种SQL分页法

表中主键必须为标识列,[ID] int IDENTITY (1,1)
1.分页方案一:(利用Not In和SELECT TOP分页)
语句形式: 
SELECT TOP 页记录数量 *
from 表名
WHERE (ID NOT IN
  (SELECT TOP (每页行数*(页数-1)) ID
  from 表名
  ORDER BY ID))
  ORDER BY ID
//自己还可以加上一些查询 ......

SQL随机查询

SQL Server:
Select TOP N * from TABLE Order By NewID()  
Select TOP N * from TABLE Order By NewID()
NewID()函数将创建一个 uniqueidentifier 类型的唯一值。上面的语句实现效果是从Table中随机读取N条记录。
Access:
Select TOP N *&n ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号