行列转换实例
SQL行列转换(转载)                  表ttt有三个字段
SQL行列转换(转载)                  seq  
--序列
SQL行列转换(转载)
                  jcxm --检查项目
SQL行列转换(转载)
                  zhi  --
SQL行列转换(转载)

SQL行列转换(转载)                  数据分别如下:
SQL行列转换(转载)                  seq   jcxm       zhi
SQL行列转换(转载)                  
-------      --------          --------
SQL行列转换(转载)
                  11     1    0.50
SQL行列转换(转载)                  
11     2    0.21
SQL行列转换(转载)                  
11     3    0.25
SQL行列转换(转载)                  
12     1    0.24
SQL行列转换(转载)                  
12     2    0.30
SQL行列转换(转载)                  
12     3    0.22                             
SQL行列转换(转载)
SQL行列转换(转载)                  实现功能
SQL行列转换(转载)                  创建视图时移动行值为列值
SQL行列转换(转载)
SQL行列转换(转载)
SQL行列转换(转载)                  
create view v_view1
SQL行列转换(转载)                  
as
SQL行列转换(转载)                  
select seq,
SQL行列转换(转载)                         
sum(decode(jcxm,1, zhi)) 检测项目1,
SQL行列转换(转载)                         
sum(decode(jcxm,2, zhi)) 检测项目2, 
SQL行列转换(转载)                         
sum(decode(jcxm,3, zhi)) 检测项目3 
SQL行列转换(转载)                  
from ttt
SQL行列转换(转载)                  
group by seq;
SQL行列转换(转载)
SQL行列转换(转载)                  序号 检测项目1  检测项目2  检测项目3
SQL行列转换(转载)                  
11     0.50    0.21     0.25
SQL行列转换(转载)                  
12     0.24    0.30     0.22
SQL行列转换(转载)
SQL行列转换(转载) 
SQL行列转换(转载)
SQL行列转换(转载)                  技巧:
SQL行列转换(转载)                  用THEN中的0和1来进行统计(
SUM
SQL行列转换(转载)
SQL行列转换(转载)                  jcxm   zhi
SQL行列转换(转载)                  
----   ----
SQL行列转换(转载)
                  a           1
SQL行列转换(转载)                  b           
1
SQL行列转换(转载)                  a           
3
SQL行列转换(转载)                  d           
2
SQL行列转换(转载)                  e           
4
SQL行列转换(转载)                  f           
5
SQL行列转换(转载)                  a           
5
SQL行列转换(转载)                  d           
3
SQL行列转换(转载)                  d           
6
SQL行列转换(转载)                  b           
5
SQL行列转换(转载)                  c           
4
SQL行列转换(转载)                  b           
3
SQL行列转换(转载)                  求他的zhi既是1,也是3,也是5的jcxm
SQL行列转换(转载)                  方法一
SQL行列转换(转载)                  
select jcxm
SQL行列转换(转载)                  
from ttt
SQL行列转换(转载)                  
group by jcxm
SQL行列转换(转载)                  
having sum(decode(zhi,1,-1,3,-1,5,-1,0)) = -3
SQL行列转换(转载)                  方法二
SQL行列转换(转载)                  
select jcxm from ttt 
SQL行列转换(转载)                  
group by jcxm having (sign(sum(decode(zhi,1,-1,0)))+
SQL行列转换(转载)                  
sign(sum(decode(zhi,3,-1,0)))+sign(sum(decode(zhi,5,-1,0)))<=-3);
SQL行列转换(转载)
SQL行列转换(转载)                  
----------
SQL行列转换(转载)
                  a
SQL行列转换(转载)                  b
SQL行列转换(转载)                  说明:
SQL行列转换(转载)                  
sign()函数根据某个值是0、正数还是负数,分别返回0、1-1
SQL行列转换(转载)                  所以可以用sign和decode来完成比较字段大小来区某个字段
SQL行列转换(转载)                  
select decode(sign(字段1-字段2),-1,字段3,字段4) from dual;
SQL行列转换(转载)
SQL行列转换(转载)                  sign是一个对于写分析SQL有很强大的功能
SQL行列转换(转载)                  下面我对sign进行一些总结:
SQL行列转换(转载)                  但属性student取0和1以外的值,或者student取两个以上的标法值,问题就不会这么简单了
SQL行列转换(转载)                  解决办法就是特征函数(
abs(),sign())
SQL行列转换(转载)
SQL行列转换(转载)                  常用的特征算法
SQL行列转换(转载)                  [A=B]=
1abssign(A-B))
SQL行列转换(转载)                  [A!=B]=
abssign(A-B)) 
SQL行列转换(转载)                  [A
<B]=1sign1sign(A-B)) 
SQL行列转换(转载)                  不能用
-sign(A-B):因为如果不满足A<b则返回-1,而不是0,这样就不能用在字段选择上了
SQL行列转换(转载)                  [A
<=B]=sign(1sign(A-B))
SQL行列转换(转载)                  [A
>B]=1sign1sign(A-B))
SQL行列转换(转载)                  [A
>=B]=sign(1sign(A-B)))
SQL行列转换(转载)                  [NOTα]=
1-d [α]
SQL行列转换(转载)                  [αANDb ]=d [α]
*d [b ] (6)
SQL行列转换(转载)                  [αOR b ]=
sign(d [α]+d []
SQL行列转换(转载)
SQL行列转换(转载)                  例如:
SQL行列转换(转载)                  A
<B                         Decode( Sign(A-B), -110 )      
SQL行列转换(转载)                     
SQL行列转换(转载)                  A
<=B                         Decode( Sign(A-B), 101 )      
SQL行列转换(转载)                     
SQL行列转换(转载)                  A
>B                         Decode( Sign(A-B), 110 )       
SQL行列转换(转载)                    
SQL行列转换(转载)                  A
>=B                         Decode( Sign(A-B), -101 )     
SQL行列转换(转载)                      
SQL行列转换(转载)                  A
=B                         Decode( A, B, 10 )         
SQL行列转换(转载)                  A 
between B and C      Decode( Sign(A-B), -10
SQL行列转换(转载)                  Decode(
Sign(A-C), 101 ))         
SQL行列转换(转载)                  A 
is null                       Decode(A,null,1,0)         
SQL行列转换(转载)                  A 
is not null                 Decode(A,null,0,1)         A in 
SQL行列转换(转载)                  (B1,B2,SQL行列转换(转载),Bn)  Decode(A,B1,
1,B2,1,SQL行列转换(转载),Bn,1,0)         
SQL行列转换(转载)                  nor LogA                    Decode( LogA, 
010 )            
SQL行列转换(转载)                    (
1-Sign(LogA)) 
SQL行列转换(转载)                  LogA 
and LogB            LogA * LogB 
SQL行列转换(转载)                  LogA 
or LogB              LogA + LogB 
SQL行列转换(转载)                  LogA xor LogB            Decode(
Sign(LogA),Sign(LogB),0,1)    
SQL行列转换(转载)                  Mod(
Sign(LogA),Sign(LogB),2
SQL行列转换(转载)
SQL行列转换(转载)
SQL行列转换(转载)                  
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SQL行列转换(转载)
SQL行列转换(转载)                  
[NextPage]
SQL行列转换(转载)                  另外一个关于成绩的分析例子
SQL行列转换(转载)
SQL行列转换(转载)                  
SELECT
SQL行列转换(转载)                  
SUM(CASE WHEN cj <60 THEN 1 ELSE 0 ENDas "not passed",
SQL行列转换(转载)                  
SUM(CASE WHEN cj BETWEEN 60 AND 79 THEN 1 ELSE 0 ENDas 
SQL行列转换(转载)                  "passed",
SQL行列转换(转载)                  
SUM(CASE WHEN cj BETWEEN 80 AND 89 THEN 1 ELSE 0 ENDas 
SQL行列转换(转载)                  "good",
SQL行列转换(转载)                  
SUM(CASE WHEN cj >=90 THEN 1 ELSE 0 ENDas "Excellent"
SQL行列转换(转载)                  
FROM cjtable;
SQL行列转换(转载)
SQL行列转换(转载)                  decode用法2
SQL行列转换(转载)                  表、视图结构转化
SQL行列转换(转载)                  现有一个商品销售表sale,表结构为:
SQL行列转换(转载)                  
month    char(6)      --月份
SQL行列转换(转载)
                  sell    number(10,2)    --月销售金额
SQL行列转换(转载)

SQL行列转换(转载)                  现有数据为:
SQL行列转换(转载)                  
200001  1000
SQL行列转换(转载)                  
200002  1100
SQL行列转换(转载)                  
200003  1200
SQL行列转换(转载)                  
200004  1300
SQL行列转换(转载)                  
200005  1400
SQL行列转换(转载)                  
200006  1500
SQL行列转换(转载)                  
200007  1600
SQL行列转换(转载)                  
200101  1100
SQL行列转换(转载)                  
200202  1200
SQL行列转换(转载)                  
200301  1300
SQL行列转换(转载)
SQL行列转换(转载)                  想要转化为以下结构的数据:
SQL行列转换(转载)                  
year   char(4)          --年份
SQL行列转换(转载)
                  ------------   ---------------------         
SQL行列转换(转载)
                  -------------------
SQL行列转换(转载)
                  month1  number(10,2)   --1月销售金额
SQL行列转换(转载)
                  month2  number(10,2)   --2月销售金额
SQL行列转换(转载)
                  month3  number(10,2)   --3月销售金额
SQL行列转换(转载)
                  month4  number(10,2)   --4月销售金额
SQL行列转换(转载)
                  month5  number(10,2)   --5月销售金额
SQL行列转换(转载)
                  month6  number(10,2)   --6月销售金额
SQL行列转换(转载)
                  month7  number(10,2)   --7月销售金额
SQL行列转换(转载)
                  month8  number(10,2)   --8月销售金额
SQL行列转换(转载)
                  month9  number(10,2)   --9月销售金额
SQL行列转换(转载)
                  month10  number(10,2)     --10月销售金额
SQL行列转换(转载)
                  month11  number(10,2)     --11月销售金额
SQL行列转换(转载)
                  month12  number(10,2)     --12月销售金额
SQL行列转换(转载)

SQL行列转换(转载)                  结构转化的SQL语句为:
SQL行列转换(转载)                  
create or replace view
SQL行列转换(转载)                  v_sale(
year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)
SQL行列转换(转载)                  
as
SQL行列转换(转载)                      
select 
SQL行列转换(转载)                      substrb(
month,1,4),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'01',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'02',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'03',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'04',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'05',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'06',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'07',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'08',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'09',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'10',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'11',sell,0)),
SQL行列转换(转载)                      
sum(decode(substrb(month,5,2),'12',sell,0))
SQL行列转换(转载)                      
from sale
SQL行列转换(转载)                      
group by substrb(month,1,4);
SQL行列转换(转载)
SQL行列转换(转载)                  体会:要用decode 
/group by/ order by/sign/sum来实现不同报表的生成 
SQL行列转换(转载)                  
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SQL行列转换(转载)                  CASE应用
SQL行列转换(转载)
SQL行列转换(转载)                  
1        1        部门a        800        男
SQL行列转换(转载)                  
2        2        部门b        900        女
SQL行列转换(转载)                  
3        3        部门a        400        男
SQL行列转换(转载)                  
4        4        部门d        1400        女
SQL行列转换(转载)                  
5        5        部门e        1200        男
SQL行列转换(转载)                  
6        6        部门f        500        男
SQL行列转换(转载)                  
7        7        部门a        300        女
SQL行列转换(转载)                  
8        8        部门d        1000        男
SQL行列转换(转载)                  
9        9        部门d        1230        女
SQL行列转换(转载)                  
10        10        部门b        2000        女
SQL行列转换(转载)                  
11        11        部门c        2000        男
SQL行列转换(转载)                  
12        12        部门b        1200        男
SQL行列转换(转载)
SQL行列转换(转载)                    
SELECT jcxm as 部门,COUNT(seq) as 人数,
SQL行列转换(转载)                      
SUM(CASE SEX WHEN 1 THEN 1 ELSE 0 ENDas 男,
SQL行列转换(转载)                            
SUM(CASE SEX WHEN 2 THEN 1 ELSE 0 ENDas 女,
SQL行列转换(转载)                      
SUM(CASE SIGN(zhi-800WHEN -1 THEN 1 ELSE 0 ENDas 
SQL行列转换(转载)                  小于800元,
SQL行列转换(转载)                      
SUM((CASE SIGN(zhi-800)*SIGN(zhi-1000)                    

相关文章: