如何编写一个查询,该查询会将始终具有1行和许多列的表取消透视表到具有2列的结果集中:column_name和value。我知道表格的底层结构是真正的问题所在,但是我无法改变这一点。该查询还必须不了解所述表中的列的名称和/或数量,因为经常添加列(同样,我知道,不良的设计,无法更改它),我也不想每次html" target="_blank">添加新列时都必须更新查询。我已经能够使用unpivot完成一些操作,但是该查询要求对列名进行硬编码。
这有可能吗?
oracle11gR2
听起来好像要取消透视表(透视将涉及从多行和2列到具有多列的1行)。您很可能需要使用动态SQL来生成查询,然后使用DBMS_SQL
包(或可能使用EXECUTE IMMEDIATE
)执行查询。您还应该能够构造完成透视的流水线表功能。您还需要在流水线表函数中使用动态SQL,但这可能会减少代码量。我希望使用纯动态SQL语句UNPIVOT
会更高效。
一种效率低下的方法,但相对容易遵循的方法可能是:
SQL> ed
Wrote file afiedt.buf
1 create or replace type emp_unpivot_type
2 as object (
3 empno number,
4 col varchar2(4000)
5* );
SQL> /
Type created.
SQL> create or replace type emp_unpivot_tbl
2 as table of emp_unpivot_type;
3 /
Type created.
SQL> ed
Wrote file afiedt.buf
1 create or replace function unpivot_emp
2 ( p_empno in number )
3 return emp_unpivot_tbl
4 pipelined
5 is
6 l_val varchar2(4000);
7 begin
8 for cols in (select column_name from user_tab_columns where table_name = 'EMP')
9 loop
10 execute immediate 'select ' || cols.column_name || ' from emp where empno = :empno'
11 into l_val
12 using p_empno;
13 pipe row( emp_unpivot_type( p_empno, l_val ));
14 end loop;
15 return;
16* end;
SQL> /
Function created.
然后,您可以在SQL语句中调用它(我认为您至少需要带有列名的第三列)
SQL> ed
Wrote file afiedt.buf
1 select *
2* from table( unpivot_emp( 7934 ))
SQL> /
EMPNO COL
---------- ----------------------------------------
7934 7934
7934 MILLER
7934 CLERK
7934 7782
7934 23-JAN-82
7934 1301
7934
7934 10
8 rows selected.
一种更有效的方法是改编Tom
Kyte的show_table流水线表函数。
问题内容: 我目前的布局为: 并且我想“取消透视”数据,使其看起来像: 使用pandas / NumPy完成此操作的最佳方法是什么? 问题答案: 您只需要做,这将创建一个以月为第一级,以年为第二级索引的MultiIndexed Series。如果您希望它们成为列,则在此之后调用。
主要内容:语法Transact SQL 中的 Pivot 和 Unpivot 是关系运算符。可以用于将一张表转换成另一张表,以实现对桌子的清晰视图。 Pivot 运算符将行数据转换为列数据。 Unpivot 关系运算符的工作方式与 Pivot 运算符相反。它将基于列的数据转换为基于行的数据,将基于行的数据转换为基于列的数据。 语法 1. Pivot: 2. UnPivot: 示例1 在这里,我们创建的表名为“t
假设我有一个表示逻辑布尔索引的n(其中n是函数未知的)熊猫系列的列表/迭代,我想以元素方式与它们进行AND,并使用结果系列对DataFrame进行索引。 目前我正在使用以及for循环来实现这一点。我在使用或时运气不太好。熊猫们似乎不喜欢被他们操作。 我已经挠头有一段时间了,我可能看不到为什么这似乎会导致一系列布尔值,但我在执行时得到了
问题内容: 我有: MySql输出:“列’price’的列说明符不正确 为什么是这样? 问题答案: 指定数据类型时无效。 您可以在括号忽略值,例如只是有本身或指定使用类似的括号内的数值(见本的信息,什么样的价值观是说......你可能需要这些取决于什么你打算定制存储在列中)
问题内容: 我正在尝试插入我的MySQL数据库。第一列是“ id”列,因为它是一个auto_increment字段,所以我将其留为空白。由于某些原因,我无法插入,并且出现了下面提到的错误。我对此表示感谢。 尝试插入时出现以下错误: 我的查询 问题答案: 这可能意味着您是一个整数,并且您正在尝试发送字符串。您应该指定一个列列表,并从中删除它。
我在使用Hibernate创建表时遇到了一些困难,出现了以下异常: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:列“id”的列说明符不正确 任何帮助都很感激。