-11

次のデータがあります。

    htno         sub       marks        credits
      1           a          15            0
      1           b          10            0 
      1           c          25            4
      1           d          24            4
      1           e          22            2
      1           f          12            0
      2           a          22            4 
      2           b          15            0
      2           c          23            4
      2           d          18            2 
      2           e          20            4
      2           f          6             0
      3           a          22            4  n so on

ユーザーにフォームを提供します。ユーザーがホルトチケット番号「1」を入力すると、PHP および MySQL で次のように出力が表示されます。

            Number of Backlogs           Passed Subjects
                   3                           3

つまり、ゼロの数を数え、バックログの数を表示し、ゼロ以外の数を数え、合格した被験者の数を表示する必要があります。

これどうやってするの?

4

1 に答える 1

12

テキスト形式のデータから末尾と先頭のスペースを取り除き、SQL Fiddle を使用して同等のサンプル スキーマを作成しました。セットアップは次のようになります。

CREATE TABLE Grades
    (`htno` int, `sub` varchar(1), `marks` int, `credits` int)
;

INSERT INTO Grades
    (`htno`, `sub`, `marks`, `credits`)
VALUES
    (1, 'a', 15, 0),
    (1, 'b', 10, 0),
    (1, 'c', 25, 4),
    (1, 'd', 24, 4),
    (1, 'e', 22, 2),
    (1, 'f', 12, 0),
    (2, 'a', 22, 4),
    (2, 'b', 15, 0),
    (2, 'c', 23, 4),
    (2, 'd', 18, 2),
    (2, 'e', 20, 4),
    (2, 'f', 6, 0),
    (3, 'a', 22, 4)
;

私は次の仮定をしました:

  • 各行は、科目における学生の達成度を表します。
  • 「halticket 番号」は各学生を一意に識別し、列で表されますhtno
  • 列のゼロの値はcredits、学生の「バックログ」の科目を表します。
  • 列のゼロより大きい値creditsは、「合格者」を表します。

このクエリは要件を満たしています。

SELECT
  SUM(CASE WHEN credits = 0 THEN 1 ELSE 0 END) AS `Number of backlogs`,
  SUM(CASE WHEN credits > 0 THEN 1 ELSE 0 END) AS `Passed subjects`
FROM Grades
WHERE htno = 1;

フィルタをSELECT使用して、Grades テーブルからホルトチケット番号 1 の学生のすべての行を取得します。WHERE

最初のCASE式は、credits がゼロ以外の場合は 0 を含み、それ以外の場合は 1 を含む新しい列を計算します。

2 番目のCASE式は、クレジットが正でない場合は 0 を含み、それ以外の場合は 1 を含む新しい列を計算します。

中間結果は次のようになると想像できます。

[Case expression 1] [Case expression 2]
0   1
0   1
1   0
1   0
1   0
0   1

結果セット全体を集計用のグループとして扱い、SUM関数を使用して 1 番目と 2 番目の計算列のすべての値を合計します。

最初の列の合計は 3 で、2 番目の列の合計は 3 です。

これにより、最終的な結果セットが得られます。

SQL Fiddleで私のインタラクティブなソリューションを試すことができます。

于 2012-09-13T18:19:06.373 に答える