我有下表,发现很难产生预期的输出。我已经尝试了以下查询,但它没有产生正确的'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
1条答案
按热度按时间w6lpcovy1#
假设
score
实际上是一个数字,而不是像98%
那样的字符串,那么当前的查询似乎可以工作,并且(添加了cat5
)生成:| 平均项目|组织标识|类别1|第2类|第三类|第四类|五类|
| - -|- -|- -|- -|- -|- -|- -|
| 九十九|一个|九十九| * 空值 | 空值 | 空值 | 空值 *|
| 十二个|四个| * 空值 *| 十二个| * 空值 | 空值 | 空值 *|
| 七十八人|五个| * 空值 *| 七十八人| * 空值 | 空值 | 空值 *|
| 九十八|六个| * 空值 | 空值 | 空值 | 空值 *| 九十八|
这似乎是对的。
但是,在所需的结果中没有使用计算的分析
avg_item
,因此可以从子查询中删除它。而且,可以将透视表的结果与org
表进行外部联接,以获得组织名称:或者更简单地说:
两者都得到:
| 组织名称|第一类|2类|三类|四类|五类|
| - -|- -|- -|- -|- -|- -|
| ABC公司|九十九| * 空值 | 空值 | 空值 | 空值 *|
| 药品审评中心| * 空值 | 空值 | 空值 | 空值 | 空值 *|
| 生长激素| * 空值 | 空值 | 空值 | 空值 | 空值 *|
| 谷歌| * 空值 *| 十二个| * 空值 | 空值 | 空值 *|
| 雅虎| * 空值 *| 七十八人| * 空值 | 空值 | 空值 *|
| 脸书| * 空值 | 空值 | 空值 | 空值 *| 九十八|
fiddle
您的预期结果似乎包含错误的组织值(或
org
表中的错误ID),但除此之外,这似乎是您想要的结果。