oracle 使用AVG的PIVOT在我的查询中无法正常工作

ki0zmccv  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(222)

我有下表,发现很难产生预期的输出。我已经尝试了以下查询,但它没有产生正确的'AVG'使用'PIVOT'。平均值应显示在各自的列类别作为每个输出。在我下面的查询它不工作

SELECT *
FROM (select     avg(hd.SCORE) over(partition by hd.org_id) Avg_Item
, hd.org_id,d.cateogory,hd.score FROM Category d JOIN Assign hd ON d.catid=hd.catid) first
PIVOT (
  AVG(score)
  FOR (cateogory)
  IN ('cat1' as "cat1",'cat2' as "cat2",'cat3' as "cat3",'cat4' as "cat4")
)PIV;

示例表和预期输出

Category table                     
-----------------------
catid  cateogory              

1      cat1
2      cat2
3      cat3
4      cat4
5      cat5

Assign table
--------------------------
Aid(pk)  catid(fk) pid Score org_id
1          1       1     98  1
2          1       2     99  1
3          1       3     100 1
4          2       4      12 4
5          2       8       78 5
6          5       9       98 6

org Table
-----------------------------
org_id org_name
1        ABC
2        CDE
3        FGH
4        Google
5        Yahoo
6        Facebook

Desired output
----------------------------------

org_name   cat1  cat2  cat3  cat4 cat5

ABC         99 
CDE               12     
FGH              
Google            78
Yahoo                              98
Facebook
w6lpcovy

w6lpcovy1#

假设score实际上是一个数字,而不是像98%那样的字符串,那么当前的查询似乎可以工作,并且(添加了cat5)生成:
| 平均项目|组织标识|类别1|第2类|第三类|第四类|五类|
| - -|- -|- -|- -|- -|- -|- -|
| 九十九|一个|九十九| * 空值 | 空值 | 空值 | 空值 *|
| 十二个|四个| * 空值 *| 十二个| * 空值 | 空值 | 空值 *|
| 七十八人|五个| * 空值 *| 七十八人| * 空值 | 空值 | 空值 *|
| 九十八|六个| * 空值 | 空值 | 空值 | 空值 *| 九十八|
这似乎是对的。
但是,在所需的结果中没有使用计算的分析avg_item,因此可以从子查询中删除它。而且,可以将透视表的结果与org表进行外部联接,以获得组织名称:

SELECT o.org_name, p.cat1, p.cat2, p.cat3, p.cat4, p.cat5
FROM org o
LEFT JOIN (
  SELECT *
  FROM (
    SELECT hd.org_id, d.cateogory, hd.score
    FROM Category d
    JOIN Assign hd ON d.catid=hd.catid
  )
  PIVOT (
    AVG(score)
    FOR (cateogory)
    IN ('cat1' as cat1, 'cat2' as cat2, 'cat3' as cat3, 'cat4' as cat4, 'cat5' as cat5)
  )
) p
ON p.org_id = o.org_id
ORDER BY o.org_id;

或者更简单地说:

SELECT o.org_name, p.cat1, p.cat2, p.cat3, p.cat4, p.cat5
FROM (
  SELECT hd.org_id, d.cateogory, hd.score
  FROM Category d
  JOIN Assign hd ON d.catid=hd.catid
)
PIVOT (
  AVG(score)
  FOR (cateogory)
  IN ('cat1' as cat1, 'cat2' as cat2, 'cat3' as cat3, 'cat4' as cat4, 'cat5' as cat5)
) p
RIGHT JOIN org o
ON o.org_id = p.org_id
ORDER BY o.org_id;

两者都得到:
| 组织名称|第一类|2类|三类|四类|五类|
| - -|- -|- -|- -|- -|- -|
| ABC公司|九十九| * 空值 | 空值 | 空值 | 空值 *|
| 药品审评中心| * 空值 | 空值 | 空值 | 空值 | 空值 *|
| 生长激素| * 空值 | 空值 | 空值 | 空值 | 空值 *|
| 谷歌| * 空值 *| 十二个| * 空值 | 空值 | 空值 *|
| 雅虎| * 空值 *| 七十八人| * 空值 | 空值 | 空值 *|
| 脸书| * 空值 | 空值 | 空值 | 空值 *| 九十八|
fiddle
您的预期结果似乎包含错误的组织值(或org表中的错误ID),但除此之外,这似乎是您想要的结果。

相关问题