先看看交叉表什么样子:

“交叉表”对象是一个网格,用来根据指定的条件返回值。数据显示在压缩行和列中。这种格式易于比较数据并辨别其趋势。它由三个元素组成:

摘要字

  • “交叉表”中的行沿水平方向延伸(从一侧到另一侧)。在上面的示例中,“手套”(Gloves) 是一行。
  • “交叉表”中的列沿垂直方向延伸(上下)。在上面的示例中,“美国”(USA) 是一列。
  • 汇总字段位于行和列的交叉处。每个交叉处的值代表对既满足行条件又满足列条件的记录的汇总(求和、计数等)。在上面的示例中,“手套”和“美国”交叉处的值是四,这是在美国销售的手套的数量

下面实现一个例子:

有一个表:  
BH            GZLB          JE  
----------------------  
001            A              100  
001            B              150  
001            C              110  
002            A              99  
002            B              180  
002            C              150  
003            A              160  
003            B              170  
003            C              130  
用SQL语句如何将上面的表变成下面横向的排列方式呢。  
BH        A      B      C  
-------------------  
001    100    150  110  
002    99      180  150  
003    160    170  130        
(GZLB  里面的字段是动态的,不是只有A,B,C  可能还有A,B,C,D,E...)  

准备数据:


if  exists(select  name  from  sysobjects  where  name='tblA'  and  xtype='U')  
     drop  table  tblA  
 
create  table  tblA(  
   BH  char(3)  not  null,  
   GZLB  varchar(3)  not  null,  
   JE  int  not  null  
)  
go  
 
insert  tblA  values('001',            'A',              100)  
insert  tblA  values('001',            'B',              150)  
insert  tblA  values('001',            'C',              110)  
insert  tblA  values('002',            'A',              99)  
insert  tblA  values('002',            'B',              180)  
insert  tblA  values('002',            'C',              150)  
insert  tblA  values('003',            'A',              160)  
insert  tblA  values('003',            'B',              170)  
insert  tblA  values('003',            'C',              130)  

查询sql语句如下: 

select max(case GZLB when 'A' then JE else null end) as 'A',

        max(case GZLB when 'B' then JE else null end) as 'B',

        max(case GZLB when 'C' then JE else null end) as 'C' from tblA group by BH // 每个case只能得到一个数据,所以用max聚合函数的目的是对了配合后面的group by ,否则会出错(GZLB, JE不在group by 或者聚合函数中的错误)

当然这样还没有进行相关的统计只是把表行变列了,下会分解吧

 

 

posted on 2011-04-12 17:50  cnby  阅读(2861)  评论(0编辑  收藏  举报