`
water84222
  • 浏览: 375203 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

行变列 交叉查询

阅读更多

/*范例表  
  create   table   表1   (  
  號數   char(10),    
  成績   integer,    
  科目   char(10)   )    
  insert   into   表1   select   '1',60,'数学'    
  union   select   '1',43,'物理'    
  union   select   '1',100,'语文'    
  union   select   '2',87,'语文'    
  union   select   '2',99,'数学'    
  union   select   '2',89,'物理'    
  union   select   '2',87,'语文'    
  */  
  Create   procedure   RowToColumn  
      @Table   varchar(30),                     --表名  
      @MasterField   varchar(30), --待转名称列名   char字段  
      @SlaveField   varchar(30), --待转数据列名   int型字段  
      @GroupID   varchar(30) --分组ID  
      as  
  --调用方法   RowToColumn   '表1','科目','成績','號數'  
  --by   jinjazz     环境   SQLServer2000  
  begin  
      DECLARE   @mSQL   VARCHAR(8000)  
          set   @msql   =   'DECLARE   @SQL   VARCHAR(8000)'  
          set   @msql   =   @msql   +   '   set   @SQL=   ''select   '   +   @GroupID   +   ''''  
          set   @msql   =   @msql   +   '   SELECT   @SQL=   @SQL+'',max(CASE   WHEN   '   +  
          @MasterField   +   '=''''''+'   +   @MasterField   +   '+''''''   then     '   +   @SlaveField   +  
              '   else   0   end   )[''+'   +   @MasterField   +   '+'']''   from(select   distinct   '   +  
              @MasterField   +   '   from   '   +   @Table   +   ')   a'  
          set   @msql   =   @msql   +   '   SET   @SQL=@SQL+   ''   from   '   +   @Table   +   '   group   by   '   +  
              @GroupID   +   ''''  
          set   @msql   =   @msql   +   '   exec(@SQL)'  
          exec(@msql)  
  end 

 

 

SQL 分组 行变列的一个例子

(SQL SERVER 2000 測試OK)
1. 表格A原始数据如下:

CREATE TABLE [dbo].[A] (
 [C1] [varchar] (50) COLLATE Chinese_PRC_CS_AS NULL ,
 [C2] [varchar] (50) COLLATE Chinese_PRC_CS_AS NULL ,
 [C3] [varchar] (50) COLLATE Chinese_PRC_CS_AS NULL ,
 [C4] [varchar] (50) COLLATE Chinese_PRC_CS_AS NULL
)

insert into A ('95533','SZ','44','123000')
insert into A ('95566','SZ','44','233300')
insert into A ('95588','GZ','44','4566')
insert into A ('95599','GZ','44','456666')
insert into A ('95533','ZH','44','333333')
insert into A ('95577','DG','44','555555')
insert into A ('95588','ST','44','44444')

2. 分组行变列 处理数据:

DECLARE @SQL VARCHAR(4000)
SET @SQL='SELECT C2'
SELECT @SQL= @SQL+ ',max(CASE WHEN C1 = ''' + C1 + ''' THEN C4 ELSE 0 END) ['+C1+']' FROM (SELECT DISTINCT C1 FROM A) TAB
SET @SQL=@SQL+ ' FROM A GROUP BY C2'
EXEC (@SQL)

得到如下结果:

C2 95533 95566 95577 95588 95599
--------------------------------------------
DG 0 0 555555 0 0 
GZ 0 0 0 4566 456666 
ST 0 0 0 44444 0 
SZ 123000 233300 0 0 0 
ZH 333333 0 0 0 0 

OK, 分组就这样完成了.
参考经典实例:

/*   实例一
create table t (id int identity,name varchar(10),code int)
insert t values('人口',20)
insert t values('经济',12)
insert t values('文化',15)
insert t values('土地',45)


declare @sql varchar(1000)
set @sql = ''
select @sql = @sql+name+'=max(case when name='''+name+''' then code else null end),' from t
--print @sql
set @sql = left(@sql,len(@sql) - 1)
set @sql = 'select [姓名]=''年龄'', '+@sql+' from t'
exec (@sql)
--drop table t

实例二

create   table   #(a   varchar(100),b   int)  
  insert   #   values('aa',11)  
  insert   #   values('bb',1)  
  insert   #   values('aa',45)  
  insert   #   values('cc',81)  
  insert   #   values('a',11)  
  insert   #   values('aay',561)  
  insert   #   values('a',14)  
   
  declare   @sql   varchar(8000)  
  set   @sql   =   'select   '  
  select   @sql   =   @sql   +   'sum(case   a   when   '''+a+'''    
                                                      then   b   else   0   end)   '+a+'的数量,'  
      from   (select   distinct   a   from   #)   as   a  
   
  select   @sql   =   left(@sql,len(@sql)-1)   +   '   from   #'  
   
  exec(@sql)  
   
--  drop   table   #

*/

分享到:
评论

相关推荐

    交叉查询经典

    交叉查询经典 交叉表是一种特殊的数据表格,它可以根据指定的条件返回值,并且显示在压缩行和列中。这使得数据的比较和趋势分析变得更加容易。交叉表由三个元素组成:行、列和摘要字段。 行是交叉表的水平方向延伸...

    sql实现多行合并一行

    这个查询的可扩展性很强,因为它不依赖于特定的列数,而是根据`n_sec_code`和`c_researcher_code`进行动态处理。只需将`n_sec_code`、`c_researcher_code`和`m_researcher_stock_rel`替换为你自己的列名和表名,即可...

    iReport柱状图和交叉表画法

    在制作交叉表时,重点属性包括行分组、列分组以及数据统计。通过修改这些属性,可以在Row_groups和Column_groups中对数据进行排序和统计,从而得到更加准确和清晰的报表。 总结来说,在iReport中绘制柱状图和交叉表...

    SQL Server 交叉表查询 case

    在SQL Server中,交叉表查询(也称为PIVOT查询)是将行数据转换为列数据的一种方法。这种查询在数据分析和报表制作中非常常见,因为它可以将多个行记录的数据整理成更易于阅读的格式。在Access中,可以通过TRANSFORM...

    C#动态交叉表查询

    交叉表查询,也称为透视表或转置查询,允许用户将数据按照不同的列和行进行汇总,以揭示更深层次的模式和趋势。 在C#中实现动态交叉表查询,主要涉及到以下几个方面: 1. **ADO.NET**:这是Microsoft提供的一个...

    delphi中cxgrid 颜色设置

    在CXGrid中,你可以自定义行、列的颜色,以提高界面的可读性和美观度。以下是一些关键步骤: 1. **设置行颜色**:你可以通过调整`TcxGrid`的`Level`对象来改变行的颜色。例如,你可以访问`cxGrid1.MainView.Levels...

    SQL高级查询技术.doc

    - **子查询的使用场合**:当查询依赖于另一个查询的结果时,子查询变得非常有用。它可以将复杂的查询逻辑分解为更小、更易管理的部分,使查询更加清晰、高效。 - **子查询的规则**: - 子查询必须用括号括起来。 ...

    Access07简易教程

    3. **设置交叉表结构**:指定行标题(如学号)、列标题(如课程名称)以及值字段(如学分)。 4. **命名查询**:将查询命名为“总表”或其他有意义的名字。 5. **运行查询**:查看交叉表查询的结果,它将显示每位...

    LessGridBoilerplate一个轻量级的12列CSS网格系统

    CSS Grid由一系列行和列定义,每个交叉点形成一个单元格,元素可以在这些单元格中对齐和扩展。与传统的流式布局和Flexbox相比,Grid更适用于创建响应式和自适应的设计。 二、LESS预处理器 LESS是一种CSS预处理器,...

    SQL语法大全

    rs.moveprevious 将记录指针从当前的位置向上移一行 rs.movefirst 将记录指针移到数据表第一行 rs.movelast 将记录指针移到数据表最后一行 rs.absoluteposition=N 将记录指针移到数据表第N行 rs.absolutepage=N 将...

    二级access课件

    3. **交叉表查询**:用于统计分析,将数据按行和列排列,并在交叉点计算统计值,如总和、平均值等。 4. **操作查询**:包括生成表、删除、更新和追加四种操作。生成表查询用于创建新表,删除查询用于移除记录,更新...

    SQL查询语言技术7

    多表连接查询是SQL中最常用也是最强大的功能之一,它使得从多个表中提取相关联的数据变得简单有效。通过理解连接的概念、掌握各种连接语法和技术,可以大大提高数据查询的灵活性和效率。无论是在日常的数据管理工作...

    SQL连接查询介绍

    交叉连接(CROSS JOIN)返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 在实际应用中,SQL连接查询可以用来...

    4X4键盘扫描汇编源程序和proteus仿真

    在每个循环中,我们检查行线是否由低变高,因为这表示有按键被按下。如果检测到变化,我们可以通过交叉点来确定是哪个按键。 在汇编源程序中,常见的指令包括: 1. `MOV`:用于移动数据,如设置列线的输出状态。 2...

    在单个查询中的不同列上动态分组

    但当我们面临需求变化,或者需要根据多列或动态列进行分组时,这就变得复杂了。 在SQL Server中,我们可以使用动态SQL来解决这个问题。动态SQL允许我们在运行时构建和执行SQL语句,这样就可以在不知道具体分组列的...

    flexboxTemplate1:​​响应式2列3行flexbox入门模板

    例如,当屏幕尺寸变小时,可以通过媒体查询更改列的布局,使它们堆叠在一起,以适应移动设备。 总结来说,“flexboxTemplate1”是一个很好的学习资源,它展示了如何使用Flexbox和HTML构建一个响应式的2列3行布局。...

    非常好的数据库优化教程02

    比如在上例中,对于一个包含1000行的表,使用索引可以避免全表扫描,提高查询效率至少100倍。 不过,索引并不总是带来性能提升。在某些情况下,索引可能会导致额外的存储开销和维护成本,特别是对于频繁更新的表,...

    ireport使用 参数Parameter的用法和dataset的用法 table的用法

    交叉报表能够根据多个维度对数据进行分析,如行和列的组合,提供更深入的数据洞察。 总的来说,iReport通过参数、数据集和表格的巧妙组合,为报表设计提供了极大的灵活性和实用性。掌握这些基本元素的使用方法,将...

    MySQL 48道面试题及答案.docx

    六种关联查询是:交叉连接、内连接、外连接、联合查询、全连接、交叉连接。每种查询都有其特点和使用场景。 varchar(50) 中的 50 表示字段最多存放 50 个字符。int(20) 和 char(20) 以及 varchar(20) 的区别在于,...

Global site tag (gtag.js) - Google Analytics