2016-08-20 27 views
0

SQLクエリで計算を行おうとしていません。私は特定のロールのための明確なsub_idはを選択し、0で状態の数をカウントしたいmysqlクエリで複雑な計算を実行します

id | name 
1 | Data Structure 
2 | Cloud Computing 

:これは私のテーブルの件名の例がある

roll | sub_id | status 
abc |  1 | 1 
abc |  1 | 0 
abc |  2 | 1 
xcv |  1 | 1 
abc |  2 | 1 
abc |  1 | 1 
lkj |  2 | 0 

:私はこのようになりますテーブルの出席を持っています1でステータスを表示し、件名テーブルにリンクしてその名前を表示します。 と私はこのようなものが欲しい:

roll | sub_id |  name  | status with 0 | status with 1 
abc | 1 |Data Structure |  1  |  2 
abc | 2 |Cloud Computing |  0  |  2 

誰かが私を説明できますか? クエリでどのようにアプローチできますか?

答えて

0

あなたが行うことができます。

SELECT 
    a.roll, 
    a.sub_id, 
    b.name, 
    SUM(Case when status=0 then 1 else 0 end) as 'status with 0', 
    SUM(Case when status=1 then 1 else 0 end) as 'status with 1' 
FROM 
    myTable a inner join subject b on 
    a.sub_id = b.id 
    group by a.roll, a.sub_id; 

は、私はあなたのためのフィドルを作った:http://sqlfiddle.com/#!9/23d1d9/11/0

+0

ありがとう!ニースのアプローチ。 –

+0

このアプローチには問題があります。クエリは非集約カラム( 'b.name')を選択しています。これは' GROUP BY'節には現れず、すべてのケースで正しい結果を得られないことがあります。このクエリは、Oracle、SQL Server、および実際にはMySQL以外のデータベースでも実行されません。 –

+0

私は@TimBiegeleisenに同意します。 5.7 – Drew

3

ピボットクエリで条件付き集計を使用して、必要な出力を得ることができます。以下のサブクエリは、値が01の場合、それぞれroll/sub_idグループの合計statusの計算を計算します。

SELECT t1.roll, 
     t1.sub_id, 
     COALESCE(t2.name, 'name is NA'), 
     t1.`status with 0`, 
     t1.`status with 1` 
FROM 
(
    SELECT roll, 
      sub_id, 
      SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS `status with 0`, 
      SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS `status with 1` 
    FROM attendance 
    GROUP BY roll, 
      sub_id 
) t1 
LEFT JOIN 
subject t2 
    ON t1.sub_id = t2.id 

実行しているのデモについては、以下のリンクをクリックしてください:

SQLFiddle

+0

それサブジェクトt2の近くで構文エラーが発生する ( SELECTロール、 sub_id、 –

+0

これは非常に複雑なクエリに見えます。簡単なアプローチはありませんか? –

+0

@TomCruiseこのクエリは、それほど複雑ではありません。 –

関連する問題