使用GROUP BY的3个SELECT语句的AVG

Chr*_*isA 5 sql oracle

我正在尝试做以下事情

我有一个表QA,其中包含以下内容:

TICKET_ID   SKILL_ID  SCORE         USER
###############################################
1           10          15          USER1
1           20           5          USER1
1           30          95          USER1
2           40          20          USER1
2           50          40          USER1
3           60          70          USER1
3           70          15          USER1
Run Code Online (Sandbox Code Playgroud)

桌子SKILLS由以下材料制成:

SKILL_ID   SKILL_NAME   AREA_ID
   10       SKILL1        1
   20       SKILL2        1
   30       SKILL3        2
   40       SKILL4        2
   50       SKILL5        2
   60       SKILL6        3
   70       SKILL7        3
Run Code Online (Sandbox Code Playgroud)

和表TICKETS由以下组成:

  TICKET_ID   TICKET_NUMBER   
    1           AAA
    2           BBB
    3           CCC
Run Code Online (Sandbox Code Playgroud)

QA使用TICKET_ID获得FK到TICKETS,使用SKILL_ID获得FK到SKILLS

我需要做的是:

对于表QA中的每张票,检查每个区域的得分总和是否超过100,如果超过计数为0,则将3个结果的AVG和另一个表中的ticket_number进行分组. case我需要计算每个区域的分数,如果> 100然后0,则保留原始值,然后将3个值的平均值和分组的票号

不确定这是否可行

所以也许计算area_1的分数我做以下事情:

SELECT DECODE(100 - SUM(SCORE),
100,100,
95,95,
90,90,
85,85,
80,80,
75,75,
70,70,
65,65,
60,60,
55,55,
50,50,
45,45,
40,40,
35,35,
30,30,
25,25,
20,20,
15,15,
10,10,
5,5,
0) SCORE_A1 FROM QA WHERE SKILL_ID IN(SELECT SKILL_ID FROM SKILLS WHERE AREA_ID = 1) AND TICKET_NUMBER = :P2_TICKET_NUMBER AND QA.USER = :P2_USER GROUP BY 1
Run Code Online (Sandbox Code Playgroud)

计算area_2相同的得分但改变WHERE条件(此时WHERE AREA_ID = 2):

SELECT DECODE(100 - SUM(SCORE),
100,100,
95,95,
90,90,
85,85,
80,80,
75,75,
70,70,
65,65,
60,60,
55,55,
50,50,
45,45,
40,40,
35,35,
30,30,
25,25,
20,20,
15,15,
10,10,
5,5,
0) SCORE_A1 FROM QA WHERE SKILL_ID IN(SELECT SKILL_ID FROM SKILLS WHERE AREA_ID = 2) AND TICKET_NUMBER = :P2_TICKET_NUMBER AND QA.USER = :P2_USER GROUP BY 1
Run Code Online (Sandbox Code Playgroud)

并计算area_3的得分相同但改变WHERE条件(WHERE AREA_ID = 3):

SELECT DECODE(100 - SUM(SCORE),
100,100,
95,95,
90,90,
85,85,
80,80,
75,75,
70,70,
65,65,
60,60,
55,55,
50,50,
45,45,
40,40,
35,35,
30,30,
25,25,
20,20,
15,15,
10,10,
5,5,
0) SCORE_A1 FROM QA WHERE SKILL_ID IN(SELECT SKILL_ID FROM SKILLS WHERE AREA_ID = 3) AND TICKET_NUMBER = :P2_TICKET_NUMBER AND QA.USER = :P2_USER GROUP BY 1
Run Code Online (Sandbox Code Playgroud)

每个块都给出1个值作为输出

我想要实现的是通过ticket_number输出3个块的AVG

我试着总结3块,但它不允许我:

SELECT DECODE(100 - SUM(SCORE),
100,100,
95,95,
90,90,
85,85,
80,80,
75,75,
70,70,
65,65,
60,60,
55,55,
50,50,
45,45,
40,40,
35,35,
30,30,
25,25,
20,20,
15,15,
10,10,
5,5,
0) SCORE_A1 FROM QA WHERE SKILL_ID IN(SELECT SKILL_ID FROM SKILLS WHERE AREA_ID = 1) AND TICKET_NUMBER = :P2_TICKET_NUMBER AND QA.USER = :P2_USER GROUP BY 1
+
SELECT DECODE(100 - SUM(SCORE),
100,100,
95,95,
90,90,
85,85,
80,80,
75,75,
70,70,
65,65,
60,60,
55,55,
50,50,
45,45,
40,40,
35,35,
30,30,
25,25,
20,20,
15,15,
10,10,
5,5,
0) SCORE_A1 FROM QA WHERE SKILL_ID IN(SELECT SKILL_ID FROM SKILLS WHERE AREA_ID = 2) AND TICKET_NUMBER = :P2_TICKET_NUMBER AND QA.USER = :P2_USER GROUP BY 1
+
SELECT DECODE(100 - SUM(SCORE),
100,100,
95,95,
90,90,
85,85,
80,80,
75,75,
70,70,
65,65,
60,60,
55,55,
50,50,
45,45,
40,40,
35,35,
30,30,
25,25,
20,20,
15,15,
10,10,
5,5,
0) SCORE_A1 FROM QA WHERE SKILL_ID IN(SELECT SKILL_ID FROM SKILLS WHERE AREA_ID = 3) AND TICKET_NUMBER = :P2_TICKET_NUMBER AND QA.USER = :P2_USER GROUP BY 1
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 4

请尝试以下查询:

SELECT
    AREAS_SCORES.USER,
    AREAS_SCORES.TICKET_ID,
    AREAS_SCORES.TICKET_NUMBER,
    AVG(CASE 
            WHEN AREAS_SCORES.AREA_SUM_SCORE > 100 THEN 0
            ELSE AREAS_SCORES.AREA_SUM_SCORE
        END) AVG_SCORE
FROM
(
    SELECT
        QA.USER,
        QA.TICKET_ID,
        QA.TICKET_NUMBER,
        SKILLS.AREA_ID,
        SUM(QA.SCORE) AREA_SUM_SCORE
    FROM 
        QA 
        INNER JOIN SKILLS ON SKILLS.SKILL_ID = QA.SKILL_ID
        INNER JOIN TICKETS ON TICKETS.TICKET_ID = QA.TICKET_ID
    GROUP BY
        QA.USER,
        QA.TICKET_ID,
        QA.TICKET_NUMBER,
        SKILLS.AREA_ID
) AREAS_SCORES
Run Code Online (Sandbox Code Playgroud)

子查询计算每个用户的每张票在每个区域内的分数总和。然后再次汇总信息以计算平均值,但有一个限制:当特定区域的分数总和超过时100,应计为0

我希望它能以某种方式有所帮助(假设我很好地理解你的问题)。