0 0

table 中如何实现行列转换5



如上图如何通过table的行列转换将表一转换成表二的效果
大意:有多个Channel对象(id,name,tx0,tx1)然后封装到一个List中。循环输出list后show出的效果如图一,怎样通过行列转换变成图二的效果
请各位不吝赐教,谢谢!

问题补充:首先谢谢以上各位的热心回复:由于时间紧迫问题可能没有说清
我的业务逻辑是这样的:我们公司每天都要手动记录Key值文件里面值,很繁琐,为了方便希望通过程序自动读取文件里面的值,然后生成Excel打印即可。首先从多个key值文件中读取数据,这些文件结构相同的只是数据不同:文件结构如下
[loss]
ch1tx0 = 9.9
ch14tx0 = 9.0
ch36tx0 = 9.7
ch64tx0 = 9.1
ch100tx0 = 10.2
ch149tx0 = 10.6
ch1tx1 = 8.9
ch14tx1 = 9.2
ch36tx1 = 9.3
ch64tx1 = 9.3
ch100tx1 = 10.4
ch149tx1 = 10.7
这些可以封装成一个Channel对象(id,name,tx0,tx1)每个文件读取完之后将会有6个channel对象,然后再将这6个对象放到一个list中,每一个key值文件对应一个list,如果有多个文件就得到多个list,最后再把这些list合并到一个list或map中得到所有的数据然后将list在页面show出得到如图一的效果,按照这样显示方式的话会有重复的,除了值不同外,id,name都会有重复,所以想实现图二的效果,ID,name固定,只在后面显示出每一个文件对应的值即可(即每一个文件的tx0,tx1),即如下效果:
ID Name     第1机     第2机     第3机
tx0 tx1 tx0 tx1 tx0 tx1
1 ch1 10.5 11.5 9.2 10.3 9.7 9.6
2 ch14 11.5 12.5 10.2 11.3 10.7 10.6
3 ch36 12.5 13.5 11.2 12.3 11.7 11.6
4 ch64 13.5 14.5 12.2 13.3 12.7 12.6
5 ch100 14.5 15.5 13.2 14.3 13.7 13.6
6 ch19 15.5 16.5 14.2 15.3 14.7 14.6

每一机对应一个key值文件(即由原来的每一机在下面显示变为在右边显示且去掉重复的Id,name)
以上效果我是通过一个嵌套循环实现了,感觉不太好,各位还有什么好方法吗,希望不吝赐教,谢谢!

问题补充:效果放上去后排版有点乱,实际上和图二的效果差不多其中“第1机”,“第2机”,“第3机”下面都对应着tx0,tx1 形如:
第1机
tx0 tx1
10.5 10.6
2012年7月10日 11:02
  • 大小: 57 KB

7个答案 按时间排序 按投票排序

0 0

1、固定列数的行列转换

student   subject    grade
--------- ---------- --------
student1 语文       80
student1 数学       70
student1 英语       60
student2 语文       90
student2 数学       80
student2 英语       100
……
转换为
          语文      数学      英语
student1 80        70        60
student2 90        80        100
……
语句如下:
select student,
        sum(decode(subject,'语文', grade,null)) "语文",
        sum(decode(subject,'数学', grade,null)) "数学",
        sum(decode(subject,'英语', grade,null)) "英语"
from table
group by student;
2、不定列行列转换

c1 c2
--- -----------
1   我
1   是
1   谁
2   知
2   道
3   不
……
转换为
1 我是谁
2 知道
3 不
这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
     RETURN VARCHAR2
IS
      Col_c2 VARCHAR2(4000);
BEGIN
     FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
          Col_c2 := Col_c2||cur.c2;
     END LOOP;
      Col_c2 := rtrim(Col_c2,1);
     RETURN Col_c2;
END;
/
SQL> select distinct c1 ,get_c2(c1) cc2 from table;

2012年7月23日 01:08
0 0

只是你当前这点数据的话可以这么凑:

SELECT t1.id,
       t1.Name as Name,
       t1.tx0  as tx01,
       t1.tx1  as tx11,
       t2.tx0  as tx02,
       t2.tx1  as t12
  FROM whisky t1
 inner join whisky t2
    on t2.Name = t1.Name
 group by t1.id, t1.Name, t1.tx0, t1.tx1, t2.tx0, t2.tx1


测试结果:
   ID NAME TX01 TX11 TX02 T12
1 1 CHANNEL1 9.9 8.9 9.9 8.9
2 5 CHANNEL100 10.2 10.4 10.2 10.4
3 3 CHANNEL36 9.7 9.3 9.7 9.3
4 4 CHANNEL64 9.1 9.3 9.1 9.3
5 2 CHANNEL14 9.0 9.2 9.0 9.2
6 6 CHANNEL149 10.6 10.7 10.6 10.7

2012年7月10日 17:05
0 0

SELECT t1.Name as Name,t1.tx0 as tx01,t1.tx1 as tx11,t2.tx0 as tx02,t2.tx1 as t12 FROM  t1 inner join  t2 WHERE t2.Name = t1.Name

2012年7月10日 15:43
0 0


我猜你要的效果是行列转换,提供一个例子

public class Row2Col {
	
	public static void main(String[] args) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		//你提供的对象列表
		List<Channel> channelList = getChannelList();
		//你要的算法
		List<List<String>> convertedTable = convert(channelList);
		//打印结果
		print(convertedTable);
		//剩下的你自己看着办
	}

	private static List<List<String>> convert(List<Channel> channelList)
			throws IntrospectionException, IllegalAccessException,
			InvocationTargetException {
		//我只是提供思路,具体代码你自己再设计一下
		//取得channel的属性,当然你也可以用list = {"id", "name", ...}
		Field[] declaredFields = Channel.class.getDeclaredFields();
		
		List<List<String>> convertedTable = new ArrayList<List<String>>();
		
		//多少个属性表示多少行,遍历行
		for (Field field : declaredFields) {
			field.setAccessible(true);
			ArrayList<String> rowLine = new ArrayList<String>();
			//多少个channel表示有多少列,遍历列
			for (int i = 0, size = channelList.size(); i < size; i++) {
				//每一行的第一列对应channel字段名
				//所以第一列要设置为字段名
				if(i == 0){
					rowLine.add(field.getName());
				}
				//从第二列开始,某一列的某个值对应第一列的某个字段
				else{
					Channel channel = channelList.get(i);
					String val = (String) field.get(channel);
					rowLine.add(val);
				}
			}
			convertedTable.add(rowLine);
		}
		return convertedTable;
	}
	
	private static List<Channel> getChannelList () {
		List<Channel> list = new ArrayList<Channel>();
		for (int i = 0; i < 5; i++) {
			list.add(//
					new Channel("id-"+i, "name-"+i, "txt0"+i, "txt1"+i));
		}
		return list;
	}
	
	private static void print(List<List<String>> convertedTable) {
		for (List<String> list : convertedTable) {
			for (String string : list) {
				System.out.print(string+"  ");
			}
			System.out.println();
		}
	}
}

class Channel {
	private String id;
	private String name;
	private String txt0;
	private String txt1;
	public Channel(String id, String name, String txt0, String txt1) {
		super();
		this.id = id;
		this.name = name;
		this.txt0 = txt0;
		this.txt1 = txt1;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTxt0() {
		return txt0;
	}
	public void setTxt0(String txt0) {
		this.txt0 = txt0;
	}
	public String getTxt1() {
		return txt1;
	}
	public void setTxt1(String txt1) {
		this.txt1 = txt1;
	}
	
	
}

2012年7月10日 13:19
0 0

看起来是要将动态行转换成不定列?这种没有直接的sql就能写出来的,要用function或者procedure来处理,可以参考这个:
http://blog.sina.com.cn/s/blog_4c45ad8b0100lvhi.html

2012年7月10日 13:18
0 0

没看出你转化后有什么不同,我猜你是要把行转成列吧

2012年7月10日 12:37
0 0

说明一下你的业务逻辑,从图中实在看不出你的需求。

2012年7月10日 11:14

相关推荐

    table行列数据转换

    本篇文章将详细探讨“table动态行列数据转换”这一主题,帮助C#开发者理解和掌握如何在代码中实现数据的行列转换,从而避免过度依赖SQL语句。 首先,我们了解基本概念。在数据处理中,行通常代表样本,而列则代表...

    table 行列转置demo

    例如,可以使用`Array.prototype.map()`和`Array.prototype.transpose()`方法来实现行列转置。 Java在这里可能用于后端服务,处理来自前端的Ajax请求。当用户触发转置操作时,JavaScript通过Ajax发送请求到服务器,...

    sql行列转换扩展

    在本文中,我们将介绍两种类型的行列转换扩展方法:行转列结构和行列转换自适应结构。 行转列结构 行转列结构是指将多个列合并为一列,行中有共同特征的数据。这种方法通常用于将多个课程或项目合并为一个单一的列...

    sql server 行列转换

    本次提供的示例是通过动态SQL来实现行列转换的功能。下面我们将详细解析这段代码: 1. **创建测试表**: ```sql CREATE TABLE test (name CHAR(10), km CHAR(10), cj INT) GO INSERT test VALUES ('', '', 80) ...

    oracle行列转换总结

    本文将深入探讨Oracle中实现行列转换的几种方法,包括使用`UNION ALL`、`MODEL`子句以及集合类型(`collections`),并提供具体的示例来帮助理解。 ### 1. 使用`UNION ALL`进行行列转换 `UNION ALL`是一种简单直接的...

    Sql语句实现表的行列转换,行转列,列转行

    ### SQL语句实现表的行列转换,行转列,列转行 在处理数据库时,我们经常需要对数据进行各种变换以适应不同的分析需求。其中,“行列转换”就是一种非常实用的功能,它可以帮助我们将表中的行数据转换为列数据,...

    Oracle行列转换

    除了`PIVOT`和`UNPIVOT`,我们还可以利用`CASE`语句和`GROUP BY`来实现行列转换。例如,可以使用`CASE`语句结合`GROUP BY`来模拟`PIVOT`的功能。这种方法更为灵活,但可能需要更复杂的SQL代码。 在实际应用中,可能...

    oracle行列转换实例

    Oracle 提供了一种高效的方法,即使用分析函数来实现这种行列转换。分析函数主要设计用于处理累计计算等问题,但也可以用来解决行列转换这一常见需求。 1. 分析函数的基本概念 分析函数在 Oracle 数据库中扮演着...

    SQL 2008行列转换的pivot

    ### SQL 2008 行列转换 (Pivot) 的动态实现 #### 知识点一:行列转换(Pivot)的概念与应用场景 在数据库查询中,有时我们需要将数据表中的行转换为列,或者将列转换为行,这种操作被称为行列转换。行列转换在报表...

    SQL语句行列转换(附带数据库、表、视图操作)

    SQL 语句行列转换是数据库管理系统中的一种常见操作,它可以将数据从行转换为列,或者从列转换为行。在这个过程中,需要使用数据库管理语言(Database Management Language,DML)来实现数据的转换。下面我们将详细...

    excel行列转换如何实现.docx

    以下将详细讲解如何在Excel中实现行列转换的方法。 首先,启动Excel 2021或其他版本的Excel,例如Excel 2019、Excel 2016等。在实际操作中,步骤基本相同,主要的区别可能在于界面布局或功能位置的细微差异。在本文...

    webwork 中table动态增加行列

    总结来说,"webwork 中table动态增加行列"涉及的技术点包括WebWork的Action设计模式、数据绑定、转换配置、以及前后端交互。实现这一功能需要理解WebWork的MVC架构,熟悉JSP和JavaScript编程,以及对AJAX有基本了解...

    vue实现行列转换的一种方法

    行列转换是一个老生常谈的问题,这几天逛知乎有遇到了这个问题。一个前端说,拿到的数据是单列的需要做转换才能够绑定,折腾了好久才搞定,还说这个应该后端直接出数据,不应该让前端折腾。 这个嘛,行列转换在后端...

    行列转换总结.pdf

    ### 行列转换总结 #### 一、概述 在数据处理和分析中,经常会遇到需要对数据表中的行列结构进行转换的情况。这类操作通常被称为“行列转换”。本篇文档将针对行列转换的六种常见情况进行详细的说明,并通过具体的...

    行列转换,全动态难点

    本文档中的标题和描述涉及了如何实现“全动态”的行列转换,即在不预先知道具体表结构的情况下,能够根据传入的产品英文名称、表名、字段名及其对应的值来动态地进行数据处理。 #### 重要概念解释 1. **行列转换**...

    SQL行列转换 Pivot UnPivot

    Pivot 和 UnPivot 是 SQL Server 2005 中引入的两个语法,用于实现行列转换。 Pivot Pivot 语法的主要作用是将列值旋转为列名,即行转列。其基本语法为: ``` SELECT * FROM table_source PIVOT (聚合函数(value_...

    excel行列转换程序

    在Excel中,虽然没有直接的函数来实现行列转换,但可以通过一些技巧来达到类似的效果。而在更高级的数据处理环境中,如SQL Server 2005,提供了专门的`PIVOT`和`UNPIVOT`运算符来支持这些转换。 #### 二、PIVOT ...

    C#中DataTable实现行列转换的方法

    接下来,我们通过`GetCrossTable()`方法实现行列转换。这个方法接收一个DataTable作为参数,将其转换成交叉表,即将原本的“姓名”作为行标识,原来的“科目”转换为列名,对应的“分数”作为新表格的值。如果某个...

Global site tag (gtag.js) - Google Analytics