2017-06-04 6 views
1

他の言語の構文をSQLと混同している可能性がありますが、これが機能しないのはなぜですか、私のサブクエリーは間違いです。以下の2つのテーブル持っSQL:2つのテーブル間で計算された率による注文

TEST_RESULTS 
Student_ID Test_ID Test_Result 
    A1  234  90 
    B2  234  80 
    C3  345  85 
    D4  234  95 
    A1  345  95 
    C3  456  95 


TEST_DESCRIPTION 
Test_ID Test_Description Passing_Score 
    234   Test A   85 
    345   Test B   90 
    456   Test C   95 

を、私はそれによって各テストおよびソートに合格率を計算します。

私が探しています出力は:

Test_ID Test_Description students_taking students_passing rate 
456    Test C   1    1    1 
234    Test A   3    2    0.666666667 
345    Test B   2    1    0.5 

これは私のクエリ

SELECT td.Test_ID, td.Test_Description, COUNT(tr.Student_ID) as 
students_taking, students_passing, students_passing/students_taking as rate 
FROM 
(SELECT td.Test_ID, td.Test_Description, COUNT(tr.Student_ID) as 
students_passing 
FROM TEST_RESULTS tr 
JOIN TEST_DESCRIPTION td 
on tr.Test_ID = td.Test_ID 
WHERE tr.Test_Result > td.) 
GROUP BY td.Test_ID, td.Test_Description 
ORDER BY rate DESC, td.Test_ID, td.Test_Description 

である私、私はこのクエリには結果を取得していないのですので、選択から選択し、間違っています。

答えて

2

下に確認してください。 この文字列で検索してください -

;WITH CTE 
AS 
(
    SELECT 
     TD.TEST_ID, 
     TEST_DESCRIPTION, 
     COUNT(TR.STUDENT_ID) AS STUDENTS_TAKING, 
     COUNT(CASE WHEN TR.TEST_RESULT >= TD.PASSING_SCORES THEN 
      TR.STUDENT_ID END) AS STUDENTS_PASSING 
    FROM TEST_DESCRIPTION TD 
    LEFT JOIN TEST_RESULTS TR 
    ON TD.TEST_ID = TR.TEST_ID 
    GROUP BY TD.TEST_ID, 
     TEST_DESCRIPTION 
) 
SELECT 
    TEST_ID, 
    TEST_DESCRIPTION, 
    STUDENTS_TAKING, 
    STUDENTS_PASSING, 
    STUDENTS_PASSING/CONVERT (DECIMAL(4,2),STUDENTS_TAKING) AS RATE 
FROM CTE 
ORDER BY TEST_DESCRIPTION 
+0

'へと改名しましたどうもありがとうございました - 他のアプローチよりもCTEを使用するメリットは何ですか? – jeangelj

1
SELECT td.Test_ID, td.Test_Description, 
    students_taking = counts.students_taking, 
    students_passing = counts.students_passing, 
    rate    = counts.rate 
FROM TEST_DESCRIPTION td 
OUTER APPLY (
    SELECT 
     students_taking = COUNT(1), 
     students_passing = COUNT(CASE WHEN tr.Test_Result > td.Passing_score THEN 1 ELSE NULL END), 
     rate    = IIF(COUNT(1) <> 0, COUNT(CASE WHEN tr.Test_Result > td.Passing_score THEN 1 ELSE NULL END)/CAST(COUNT(1) AS FLOAT), 0) 
    FROM TEST_RESULTS tr 
    WHERE tr.Test_ID = td.Test_ID 
) counts 
ORDER BY counts.rate DESC, td.Test_ID 
+0

はありがとうブラケット – jeangelj

+0

それは別名た後、私は最後から二番目の行のTRを理解していない、私はcounts' –

1

私はCTE、LEFTは、望ましい結果を得るためにJOINを使用していquery-

SELECT TD.TEST_ID, 
TD.TEST_DESCRIPTION, 
STUDENT_TAKING, 
STUDENT_PASSING, 
RATE 
FROM TEST_DESCRIPTION TD, 
    (SELECT TR.TEST_ID,COUNT(TR.STUDENT_ID) "STUDENT_TAKING", 
    COUNT(CASE WHEN TEST_RESULT>=PASSING_SCORE THEN STUDENT_ID END) STUDENT_PASSING, 
    TO_NUMBER(TO_CHAR(COUNT(CASE WHEN TEST_RESULT>=PASSING_SCORE THEN STUDENT_ID END)/COUNT(TR.STUDENT_ID),'9999.99')) RATE 
    FROM TEST_RESULTS TR,TEST_DESCRIPTION TD 
    WHERE TR.TEST_ID=TD.TEST_ID 
    GROUP BY TR.TEST_ID)SUB 
    WHERE SUB.TEST_ID=TD.TEST_ID ORDER BY RATE DESC; 
関連する問題