当前位置: 首页 > 面试题库 >

Oracle10G SQL:将列转换为行

白文彬
2023-03-14
问题内容

我需要将列转换为行并获取其平均值。

例如,我有此表:

Name   Math    Science     Computer
----   ----    -------     --------
Ted    90       89          95
Zed    99       98          98
Fed    85       75          90

输出应为:

Subject      Average
-------      -------
Math         88
Science      87.33
Computer     94.33

我该如何实现?感谢您的帮助。


问题答案:

如果您使用的是11G,则可以使用unpivot

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT * FROM tablea
    UNPIVOT (percentage FOR subject IN (math, science, computer))
)
GROUP BY subject
ORDER BY subject;

SUBJECT  PERCENTAGE
-------- ----------
COMPUTER      94.33
MATH          91.33
SCIENCE       87.33

但是由于您不是,所以您可以伪造它。从本网站改编:

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT DECODE(unpivot_row, 1, 'Math',
                               2, 'Science',
                               3, 'Computer') AS subject,
           DECODE(unpivot_row, 1, math,
                               2, science,
                               3, computer) AS percentage
    FROM tablea
    CROSS JOIN (SELECT level AS unpivot_row FROM dual CONNECT BY level <= 3)
)
GROUP BY subject
ORDER BY subject;

SUBJECT  PERCENTAGE
-------- ----------
Computer      94.33
Math          91.33
Science       87.33

在这两种情况下,内部结构select都将行转换为列。在10克中,您只需要自己做即可。在SELECT ... CONNECT BY ...刚刚产生虚值的列表,这必须有足够的覆盖要转换为行(如果你真的有1000,你真的应该重新审视数据模型)的列数。这两个decode语句使用生成的数字来匹配列名和值-
自行运行内部选择以查找外观。

如果不采用动态SQL,就无法不必列出列-
只能使用real列出一次unpivot,而使用伪造的10g版本只能列出两次,并且必须确保它们正确匹配,并且必须确保行号生成器正在产生足够的价值。(太多,您可能会得到奇怪的结果,但是由于任何额外的值在此处都为null且您正在使用avg,因此在这种情况下并没有太大关系;就像健全性检查一样,您可能应该使其完全匹配)


或另一个版本,根据您总是想要除之外的所有列name,这意味着您只需要列出您想要的列一次,并且在视觉上将它们匹配起来更容易-
只需添加when子句即可;并且您不需要行计数:

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT column_name AS subject,
        CASE
            WHEN column_name = 'MATH' then math
            WHEN column_name = 'SCIENCE' then science
            WHEN column_name = 'COMPUTER' then computer
        END AS percentage
    FROM tablea
    CROSS JOIN (
        SELECT column_name
        FROM user_tab_columns
        WHERE table_name = 'TABLEA'
        AND column_name != 'NAME'
    )
)
GROUP BY subject
ORDER BY subject;

SUBJECT                        PERCENTAGE
------------------------------ ----------
COMPUTER                            94.33
MATH                                91.33
SCIENCE                             87.33


 类似资料:
  • 我是数据科学的初学者,我正在尝试使用Pandas来旋转此数据框架: 所以它变成这样:(标签应该变成列,文件路径变成行。) “标签”列是一组或一类文件路径。我想把它转换成这样一种方式,它适合这个函数:tf。Keras.preprocessing.image.flow_from_dataframe 提前感谢所有帮助我的人。

  • 问题内容: 考虑下面的示例,其中有一个包含人员记录的 Person 表和一个包含链接到人员的可选属性的 PersonAttribute 表: Table: Person Table PersonAttribute 我将如何编写一个查询,使所有具有属性的人都像列一样返回?我需要的结果集是: 因此,从本质上讲,我需要编写一个查询,该查询将获取所有带有所有唯一属性键的人记录,这些键被转换为具有每个人记录

  • 问题内容: 我的表包含以下列: 我想显示如下: 如您所见,我想将列与自定义列名成对显示。这对是列A和B,列C和D以及列C和D。 问题答案:

  • 问题内容: 将a 转换为同时保持Queue顺序的最快方法是什么? 问题答案: 最快的方法是首先使用LinkedList,它可用作列表或队列。 否则您需要复印 注意:处理PriorityQueue时,请使用循环,轮询每个元素并添加到列表中。要列出的PriorityQueue不维护堆顺序。

  • 问题内容: 有没有一种快速的方法可以将表TD(使用CSS或Javascript)转换为TR,目前我有: 我想翻译成: ?? 问题答案: 您想要将HTML排列成这样: 变成这个: 正确? 您可以使用Javascript来做到这一点,但是,很难在不完全了解站点/ HTML文件的结构的情况下建议一种方法。我会去的。 假设您的代码带有ID(例如:您可以像这样在javascript中访问它: 您可以创建一个

  • 问题内容: 我有一个具有当前值和先前值的sql表。 我想比较它们,如果值有变化,请在下表中显示。 在SQL 2008中是否可以不循环每一列? 问题答案: 您可以使用取消透视数据: 请参阅带有演示的SQL Fiddle。 仅仅因为我喜欢使用 数据透视 功能,所以以下是同时使用 取消 数据透视 和 数据透视 功能来获取结果的版本: 参见带有演示的SQL Fiddle