Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 3条SELECT语句的平均值(按分组)_Sql_Oracle - Fatal编程技术网

Sql 3条SELECT语句的平均值(按分组)

Sql 3条SELECT语句的平均值(按分组),sql,oracle,Sql,Oracle,我试着做以下几点 我有一个表QA,其中包含以下内容: TICKET_ID SKILL_ID SCORE USER ############################################### 1 10 15 USER1 1 20 5 USER1 1 30 95 USER1 2

我试着做以下几点

我有一个表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
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
桌子由以下部分组成:

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
  TICKET_ID   TICKET_NUMBER   
    1           AAA
    2           BBB
    3           CCC
和一张由以下材料制成的桌子:

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
  TICKET_ID   TICKET_NUMBER   
    1           AAA
    2           BBB
    3           CCC
QA有一个使用TICKET\u ID的FK to TICKET和一个使用SKILL\u ID的FK to SKILLS

我需要做的是:

对于表QA中的每张票证,检查每个区域的得分总和是否不超过100,如果超过,则算作0,然后计算3个结果的平均值,并根据另一张表中的票证编号分组 因此,对于每种情况,我需要计算每个区域的分数,如果>100,则0保留原始值,然后对3个值进行平均,并按票号分组

不确定这是否可行

因此,为了计算面积_1的分数,我可以做以下操作:

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
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
要计算面积_2的分数,请执行相同的操作,但更改WHERE条件(此时面积_ID=2):

并计算面积_3的分数,相同的事情,但改变了WHERE条件(其中面积_ID=3):

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

我试图实现的是将3个块的平均值按票号输出

我试图将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

谢谢

请尝试以下查询:

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
子查询为每个用户的每个票证计算每个区域内的分数总和。然后再次聚合信息以计算平均值,但有一个限制,即当特定区域的得分总和超过
100
,则应将其计算为
0


我希望它能在某种程度上有所帮助(假设我很了解您的问题)。

您只需一次选择即可完成这一切。您必须将
总和
案例
结合起来,如下所示:

SELECT T.TICKET_NUMBER,
SUM(CASE WHEN AREA_ID = 1 THEN QA.SCORE ELSE 0 END) SCORE_A1,
SUM(CASE WHEN AREA_ID = 2 THEN QA.SCORE ELSE 0 END) SCORE_A2,
SUM(CASE WHEN AREA_ID = 3 THEN QA.SCORE ELSE 0 END) SCORE_A3
FROM QA INNER JOIN SKILLS S ON QA.SKILL_ID = S.SKILL_ID
INNER JOIN TICKETS T ON QA.TICKET_ID = T.TICKET_ID
WHERE QA.USER = :P2_USER GROUP BY T.TICKET_NUMBER
现在,要应用附加条件以确保总和不超过100,请使用外部查询:

SELECT TICKET_NUMBER,
CASE WHEN SCORE_A1 > 100 THEN 0 ELSE SCORE_A1 END SCORE_A1,
CASE WHEN SCORE_A2 > 100 THEN 0 ELSE SCORE_A2 END SCORE_A2,
CASE WHEN SCORE_A3 > 100 THEN 0 ELSE SCORE_A3 END SCORE_A3
FROM 
   (
    SELECT T.TICKET_NUMBER,
    SUM(CASE WHEN AREA_ID = 1 THEN QA.SCORE ELSE 0 END) SCORE_A1,
    SUM(CASE WHEN AREA_ID = 2 THEN QA.SCORE ELSE 0 END) SCORE_A2,
    SUM(CASE WHEN AREA_ID = 3 THEN QA.SCORE ELSE 0 END) SCORE_A3
    FROM QA INNER JOIN SKILLS S ON QA.SKILL_ID = S.SKILL_ID
    INNER JOIN TICKETS T ON QA.TICKET_ID = T.TICKET_ID
    WHERE QA.USER = :P2_USER GROUP BY T.TICKET_NUMBER
   ) TIX
最后,如果您需要这三个分数的平均值,请使用其他级别的外部查询:

SELECT TICKET_NUMBER,
SCORE_A1,
SCORE_A2,
SCORE_A3,
(SCORE_A1+SCORE_A2+SCORE_A3)/3 AVG_SCORE
FROM
   (
    SELECT TICKET_NUMBER,
    CASE WHEN SCORE_A1 > 100 THEN 0 ELSE SCORE_A1 END SCORE_A1,
    CASE WHEN SCORE_A2 > 100 THEN 0 ELSE SCORE_A2 END SCORE_A2,
    CASE WHEN SCORE_A3 > 100 THEN 0 ELSE SCORE_A3 END SCORE_A3
    FROM 
       (
        SELECT T.TICKET_NUMBER,
        SUM(CASE WHEN AREA_ID = 1 THEN QA.SCORE ELSE 0 END) SCORE_A1,
        SUM(CASE WHEN AREA_ID = 2 THEN QA.SCORE ELSE 0 END) SCORE_A2,
        SUM(CASE WHEN AREA_ID = 3 THEN QA.SCORE ELSE 0 END) SCORE_A3
        FROM QA INNER JOIN SKILLS S ON QA.SKILL_ID = S.SKILL_ID
        INNER JOIN TICKETS T ON QA.TICKET_ID = T.TICKET_ID
        WHERE QA.USER = :P2_USER GROUP BY T.TICKET_NUMBER
       ) TIX
   ) MORE_TIX

请注意,对于解码表达式,如果您的100和(分数)不能被5整除,则结果将为零。即,如果100-总和(分数)=73,则为0。这是您所期望的吗?您能确认您正在使用Oracle(
解码
功能)吗?您好,谢谢您的回复,我正在使用Oracle 12c,所以是的,这是Oracle解码功能。您将如何检查而不是使用解码功能?我已经看到,您可以在select中嵌入一个案例,但主要问题是,我不知道如何将所有内容放在一起,以便获得每个票号的3个区域的平均值you@ChrisA. 嗨,请在下面找到答案。我希望你能得到需要的帮助。Regard请在问题中添加信息,方法是对其进行修改,而不是将其隐藏在评论中,以免在混乱中丢失。它还有助于,特别是在SQL中,为您正在使用的特定DBMS包含一个标记,因为它们之间的功能和语法各不相同。另外,没有必要大声说出问题标题中的信息。嗨@Chris。我真的很高兴它可能有用。问候:)