在我开始之前,我知道关于Stackoverflow的问题很多,但是我找不到与我的案子相关的任何问题,因为它们涉及的问题比我需要的复杂得多。
我想要的是一个简单的哑转置,不涉及逻辑。
这是我的选择查询返回的原始表:
Name Age Sex DOB Col1 Col2 Col3 ....
A 12 M 8/7 aa bb cc
通常,这将仅包含1条记录,即一个人的记录
现在我想要的是
Field Value
Name A
Age 12
Sex M
DOB 8/7
Col1 aa
Col2 bb
Col3 cc
.
.
因此,无需像Stackoverflow上的大多数类似问题那样进行计数,求和或任何复杂的逻辑。
我该怎么做?我通读了PIVOT和UNPIVOT的帮助,但那根本没有帮助。
PS:如果偶然包含多个记录,是否有可能将每个记录作为字段返回,就像
Field Value1 Value2 Value3 ...
Name A B C ...
Age .. .. .. ...
.
.
我想知道如何针对Oracle 10g和11g执行此操作
PS:如果您发现与我的确很相似的问题,可以随意将其标记为重复。
我建议先将UNPIVOT函数应用于您的多列,然后再row_number()
用于创建将在PIVOT中使用的新列名。
unpivot的基本语法为
select field,
value,
'value'||
to_char(row_number() over(partition by field
order by value)) seq
from yourtable
unpivot
(
value
for field in (Name, Age, Sex, DOB, col1, col2, col3)
) u;
请参阅带有演示的SQL
Fiddle
。这将把您的多列数据转换成多行。我曾经row_number()
为您的新列名创建一个唯一值,该查询中的数据如下所示:
| FIELD | VALUE | SEQ |
|-------|-------------------------|--------|
| AGE | 12 | value1 |
| AGE | 15 | value2 |
| COL1 | aa | value1 |
| COL1 | xx | value2 |
然后,您可以将PIVOT函数应用于此结果:
select field, value1, value2
from
(
select field,
value,
'value'||
to_char(row_number() over(partition by field
order by value)) seq
from yourtable
unpivot
(
value
for field in (Name, Age, Sex, DOB, col1, col2, col3)
) u
) d
pivot
(
max(value)
for seq in ('value1' as value1, 'value2' as value2)
) piv
请参阅带有演示的SQL Fiddle。这给出了最终结果:
| FIELD | VALUE1 | VALUE2 |
|-------|-------------------------|-------------------------|
| AGE | 12 | 15 |
| COL1 | aa | xx |
| COL2 | bb | yy |
| COL3 | cc | zz |
| DOB | 07-Aug-2001 12:00:00 AM | 26-Aug-2001 12:00:00 AM |
| NAME | A | B |
| SEX | F | M |
请注意,当您应用unpivot函数时,所有列的数据类型必须相同,因此您可能必须先在子查询中转换数据,然后才能取消数据透视。
Oracle 11g中引入了UNPIVOT / PIVOT函数,如果您使用的是Oracle 10g,则可以编辑查询以使用:
with cte as
(
select 'name' field, name value
from yourtable
union all
select 'Age' field, Age value
from yourtable
union all
select 'Sex' field, Sex value
from yourtable
union all
select 'DOB' field, DOB value
from yourtable
union all
select 'col1' field, col1 value
from yourtable
union all
select 'col2' field, col2 value
from yourtable
union all
select 'col3' field, col3 value
from yourtable
)
select
field,
max(case when seq = 'value1' then value end) value1,
max(case when seq = 'value2' then value end) value2
from
(
select field, value,
'value'||
to_char(row_number() over(partition by field
order by value)) seq
from cte
) d
group by field;
参见带有演示的SQL Fiddle
此代码正在触发错误 无效的sql对象。 从文档中我觉得表中的任何对象都是sql对象<这里怎么了? 在Oracle 10G中考虑以下函数 在10G上下文中考虑以下函数 我得到了一个错误的无效对象 我的桌子就像 此表位于“测试”模式中,我与SCOTT有联系,SCOTT有“测试时授予选择权”。测试表到scott's 我还是会出错 ERR_INVALID_OBJECT
我知道这相对简单,但我无法在归档中找到解决方案,尽管我看到了类似的解决方案,但我的SQL不足以对它们进行反向工程。 我所要做的就是从呼叫管理表中,按周分组计算团队中发出的呼叫数。下面是一个返回30000多个条目的代码示例。如果可能的话,我想把这个数字分为几周,也可以根据周五到周五的范围分为几天? 关键领域是 表名称是 这样我就可以创建一个列表,列出该支持组每周记录的通话次数 所以很简单,但是我可以
只想确认Oracle SQL中需要转义哪些字符才能避免SQL注入?到目前为止,我只发现这篇文章似乎回答了我的问题:https://ss64.com/ora/syntax-escape.html.然而,正如我所听说的,amphora“@”字符也需要转义,因此,我认为上面的文章中有不完整的需要转义的字符列表。如果有人能告诉我Oracle SQL中需要转义的字符的完整列表,我将不胜感激。
我有一个大约15万行的表,我必须使用JavaQuartz Scheduler一次获取1000行。要求是一次限制1000行,然后再限制1000行等(与MySQL限制查询相同)。 我正在使用以下查询: 问题是上面的查询返回了我在结果集中不需要的额外列rownum,因为返回的数据被传递给MapListHandler(),后者返回将结果转换为JSON,并且我将此JSON传递给不期望额外rownum列的We
在Crystal Reports中,我使用以下查询(针对Oracle数据库)为报表中的单个字段生成数据: 这可以很好地工作,并基于提供的{HB_As_At_Date}(the{?}语法是Crystal将参数值嵌入SQL(SQL)的方法。不过,上述查询的内容不是我的问题——我想做的是在几个不同的日期重复运行它,并将输出输入Crystal以供在报告中使用。 假设我希望在9月的每个星期一运行这个查询,我
你好 上面的查询包括: WITH子句-本条款的目的是从2011年至2016年间购买物品的客户中识别不同的。 第一次查询-查询的主要目的是检查上述WITH子句中是否存在任何选定的。此外,该查询还应检查所选的是否与特定的匹配,并在名为的列中将其标记为 第二次查询-此查询执行的操作与第一次查询几乎相同。唯一的区别是,它在名为“DRIVE_TYPE”的列中将标记为 您可能已经注意到,在这两个查询中,都有一
我在一次将多行插入表时面临问题,因为列id具有主键并基于序列创建。 对于ex: 以下语句创建约束违反错误: 此查询应在表test中插入3行(名称为xxx)。
没笔试 1月2号面的 现在还没回信 大概率挂了 1、先介绍了一下项目 2、C++面向对象的三大特性 3、虚函数的理解 4、两个子类继承同一个父类和一个子类继承两个父类有区别吗? 5、QT的信号和槽的原理? 6、信号和槽连接的第五个参数? 7、IO多路复用 8、介绍一下TCP和UDP协议? 9、视频聊天用的是什么协议? 10、TCP协议是如何保证可靠性传输的? 11、两个线程之间如何进行通信? 12