在Oracle中使用查询进行非规范化

时间:2015-12-30 11:49:23

标签: sql oracle pivot crosstab

我有一张这样的桌子:

STU_NAME  SUBJECT   MARKS
--------- --------- ------
1         ENGLISH   90
1         TAMIL     80 
1         MATHS     70 
2         MATHS     70
2         TAMIL     80
2         ENGLISH   95 

结果如下:

STU_NAME  MATHS_MARK  ENGLISH_MARK TAMIL_MARK  TOTAL_MARKS
--------- ----------- ------------ ----------- -------------
1            70            90            80            240
2            70            95            80            245

我们可以通过查询实现这一目标吗?

2 个答案:

答案 0 :(得分:4)

我发现最简单的方法是使用条件聚合:

select stu_name,
       max(case when subject = 'MATHS' then Marks end) as Maths,
       max(case when subject = 'ENGLISH' then Marks end) as English,
       max(case when subject = 'TAMIL' then Marks end) as Tamil,
       sum(Marks) as Total
from t
group by stu_name;

答案 1 :(得分:0)

我使用PIVOT功能得到了同样的效果。

SELECT *
FROM   (SELECT *
        FROM   x)
PIVOT  (MAX(marks)  FOR (SUBJECT) IN ('ENGLISH', 'MATHS', 'TAMIL'));

但是,我仍然面临一些问题。

  1. 使用PIVOT时是否可以获得总和(标记)。
  2. 在两个(案例,枢轴)中,在不提及每个主题(当我们确实知道什么是主题时)的情况下获得具有相应标记的主题。,?