2015-01-29 13 views
5

Tôi đang cố gắng để làm như sauAVG của 3 câu SELECT với GROUP BY

Tôi có một QA bảng, trong đó có những điều sau đây:

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 

một KỸ NĂNG bảng làm bằng:

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 

và một bảng VÉ làm bằng:

TICKET_ID TICKET_NUMBER 
    1   AAA 
    2   BBB 
    3   CCC 

QA có FK để VÉ sử dụng TICKET_ID và cũng là một FK để KỸ NĂNG sử dụng SKILL_ID

Những gì tôi sẽ cần phải làm là:

cho mỗi vé trong tầm kiểm soát bảng QA rằng tổng của điểm số trong mọi lĩnh vực làm không vượt quá 100 và nếu được tính là 0, sau đó thực hiện AVG của 3 kết quả và nhóm theo số thứ tự vé trong một bảng khác Vì vậy, đối với mỗi trường hợp, tôi sẽ cần tính điểm cho mỗi khu vực, nếu> 100 thì 0 người khác để lại giá trị ban đầu, sau đó đặt giá trị trung bình của 3 giá trị và nhóm theo số vé

Không chắc chắn nếu điều này là có thể

Vì vậy, có lẽ để tính toán số điểm của area_1 tôi thực hiện như sau:

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 

để tính toán số điểm của area_2 điều tương tự nhưng thay đổi điều kiện WHERE (WHERE AREA_ID = 2 thời điểm này):

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 

và để tính toán số điểm của area_3 điều tương tự nhưng thay đổi điều kiện 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 

Mỗi người trong t khối của ông mang lại cho giá trị 1 là đầu ra

Những gì tôi đang cố gắng để đạt được là có như đầu ra AVG 3 khối bằng ticket_number

Tôi cố gắng để tổng hợp 3 khối tất cả cùng nhau nhưng nó không cho phép tôi :

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 

Cảm ơn bạn

+0

Xin lưu ý rằng với biểu thức DECODE nếu 100 - SUM (SCORE) không chia hết bởi 5 sẽ có kết quả là ZERO. I E. nếu 100 - SUM (SCORE) = 73 sẽ có 0. Đây có phải là điều bạn mong đợi không? – cha

+0

Bạn có thể xác nhận bạn đang sử dụng chức năng Oracle ('DECODE')? –

+0

Xin chào, cảm ơn cho trả lời, tôi đang sử dụng oracle 12c vì vậy có nó là chức năng giải mã oracle. Làm thế nào bạn sẽ kiểm tra thay vì sử dụng chức năng giải mã? Tôi đã thấy rằng bạn có thể nhúng một trường hợp bên trong một lựa chọn nhưng vấn đề chính là tôi không biết làm thế nào để đặt tất cả các togheter để có trung bình của 3 khu vực cho mỗi số vé Cảm ơn bạn – ChrisA

Trả lời

3

Vui lòng thử các truy vấn sau đây:

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 

Truy vấn con tính tổng điểm số trong mỗi khu vực cho mỗi vé của mỗi người dùng. Sau đó, thông tin được tổng hợp lại để tính trung bình nhưng với giới hạn rằng khi tổng điểm cho một khu vực cụ thể vượt quá 100, thì nó sẽ được tính là 0.

Tôi hy vọng nó sẽ giúp một số cách (giả sử tôi hiểu rõ vấn đề của bạn).

+0

Xin chào T_G, cảm ơn rất nhiều, điều đó thật tuyệt vời! – ChrisA

+0

Xin chào @Chris. Tôi thực sự vui vì nó có thể xảy ra hữu ích. Kính trọng :) –

1

Bạn có thể làm điều này tất cả chỉ với một lựa chọn duy nhất.Bạn sẽ phải kết hợp các SUM với CASE, như thế này:

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 

Bây giờ, để áp dụng một tiêu chí bổ sung để đảm bảo SUM không đi hơn 100 sử dụng một truy vấn bên ngoài:

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 

Và cuối cùng, nếu bạn cần trung bình của ba điểm số này, hãy sử dụng một cấp truy vấn ngoài khác:

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 
+0

Hi Cha, không thể tin được, cảm ơn một triệu !! – ChrisA