SQL:将行变成列
Posted
技术标签:
【中文标题】SQL:将行变成列【英文标题】:SQL : Turning rows into columns 【发布时间】:2012-02-06 02:33:43 【问题描述】:我需要将行的值转换为列 - 例如:
SELECT s.section_name,
s.section_value
FROM tbl_sections s
这个输出:
section_name section_value
-----------------------------
sectionI One
sectionII Two
sectionIII Three
想要的输出:
sectionI sectionII sectionIII
-----------------------------------------
One Two Three
【问题讨论】:
如果有不止一行的section_name 为sectionI
,但值不同,会发生什么情况?你显示另一行吗?如果是这样,在 sectionII 和 section III 下应该显示什么?如果每个 section_name 的条目数不匹配,空列会去哪里?一般来说,你想要做的事情并没有很好的定义。
【参考方案1】:
这可能在您选择的编程语言中更好地在客户端完成。
您绝对需要提前知道部分名称才能将它们转换为列名称。
Oracle 11g 的更新答案(使用new PIVOT operator):
SELECT * FROM
(SELECT section_name, section_value FROM tbl_sections)
PIVOT
MAX(section_value)
FOR (section_name) IN ('sectionI', 'sectionII', 'sectionIII')
对于旧版本,您可以进行一些自联接:
WITH
SELECT section_name, section_value FROM tbl_sections
AS
data
SELECT
one.section_value 'sectionI',
two.section_value 'sectionII',
three.section_value 'sectionIII'
FROM
select selection_value from data where section_name = 'sectionI' one
CROSS JOIN
select selection_value from data where section_name = 'sectionII' two
CROSS JOIN
select selection_value from data where section_name = 'sectionIII' three
或者也使用 MAX 技巧和“聚合”:
SELECT
MAX(DECODE(section_name, 'sectionI', section_value, '')) 'sectionI',
MAX(DECODE(section_name, 'sectionII', section_value, '')) 'sectionII',
MAX(DECODE(section_name, 'sectionIII', section_value, '')) 'sectionIII'
FROM tbl_sections
【讨论】:
您好,感谢您的回答,请问有什么方法我们不知道该部分的名称并会变成列? 这将创建一个非常可怕的交叉产品,不是吗? @sprena 没有。 没有。不是单独使用 SQL。在运行查询之前,需要知道表名、列名等。也许通过 PL/SQL 使用本机动态 SQL。但这相当于“在您选择的编程语言中的客户端”。 @gfortune:如果只有一排,那也没那么可怕。但是,是的,这不能很好地扩展到许多行和/或列。 这不是最佳解决方案,一个支点就足够了。以上是关于SQL:将行变成列的主要内容,如果未能解决你的问题,请参考以下文章
根据 Oracle 10g PL/SQL 中的内容将行转为列