2017-06-27 11 views
1

私は、食事の注文ID、食事を注文した人の個人IDと食事を記録する 'orders'というテーブルを持っていますこれは1、2、または3)SQL- '類似の'行と場所の結果を別のテーブルに集計する

 orders 
oid | pid | meal 
________________ 
1 | 1 | 2 
2 | 1 | 3 
3 | 3 | 1 
4 | 5 | 2 
5 | 5 | 2 
6 | 5 | 1 

することができ、私は私がPID毎に各食事の注文の数を表示することができます結果を生成します:

pid | meal1 | meal2 | meal3 
____________________________ 
1 | 0 | 1 | 1 
3 | 1 | 0 | 0 
5 | 0 | 2 | 1 

私はないですSQLのエキスパートですが、私はまずリストをpidでグループ化し、次に食事でグループ化すると考えていました。しかし、私はどのようにカウントするのですか?私は本当に失われています。

+0

を、それを合計する必要があります。しかし、mySQLはピボットをサポートしていません。これは、case文とsumを使用して実現できます。あなたの食事が異なる列になってほしいので、食事によるグループ分けは機能しません。 case文を使用すると、各食事#ごとに列を定義し、問題のレコードが食事1,2,3用であるかどうかを単純に評価し、結果を合計することができます。 – xQbert

答えて

5

基本的には最初にするとき、あなたはpidでグループができるケースを使用して、別の食事のための複数の列を作成し、これはピボットと呼ばれる

Select pid, sum(case when meal =1 then 1 else 0 end) as meal1, 
      sum(case when meal =2 then 1 else 0 end) as meal2, 
      sum(case when meal =3 then 1 else 0 end) as meal3 
from Table 
group by pid 
+0

これは現在の状況で応答を出します。 Mealが1,2,3,4,5に増加すると、ユーザーは毎回クエリを更新する必要があります。 –

+0

上記のxQbertと同様、これはmySQLではサポートされていないピボットを使用することで実現できます。コーディング中にこの問題に直面した場合、私はステートメントを実行するときにExcelを使用するか、SAS経由で接続してproc transposeを使用します。 –

+0

申し訳ありません私はSASとproc転置方法を認識していません。私たちは手近な食事を知っている場合にのみcase文を生成することができます。もしクエリがストアドプロシージャで使われるならば、これは新しい食事が追加されるたびに変更される必要があります。 –

関連する問題