3

SQLテーブルをピボットしようとしているときに、この投稿に出くわしました 。このメソッドを使用して、クエリを作成しました。しかし、私は今、それがもちろんMAX関数で結果を集約することに気づきました。ただし、Columをピボットする必要がありますが、すべてのオカレンスを表示する必要があります。上記の投稿から取得したコード。

  SELECT dy,
         MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1,
         MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,    
    FROM Classes
GROUP BY dy

だから本質的に私はこれを使いたいのですが、max関数はありませんか?何か案は?

サンプルデータの編集

Day   Period    Subject

Mon   1         Ch
Mon   2         Ph
Tue   1         Ph
Tue   2         Ele
Mon   1         Ch
Mon   2         Ph
Tue   1         Ph
Tue   2         Ele

出力例

Day   P1   P2   

Mon   Ch   Ph   
Mon   Ch   Ph   
Tue   Ph   Ele  
Tue   Ph   Ele  

つまり、基本的に、データを2回入力すると、2回表示されます...

実際のSQLを編集します。

  SELECT other
         MAX(CASE WHEN period = 1 THEN table2.subj ELSE NULL END) AS P1,
         MAX(CASE WHEN period = 2 THEN table2.subj ELSE NULL END) AS P2    
    FROM table1
left join table2 on table2.ID = subject

GROUP BY other

サンプルデータ

表1

Dy   Period    Subject other

Mon   1         1       1
Mon   2         2       1
Tue   1         3       2
Tue   2         4       2
Mon   1         5       3
Mon   2         6       3
Tue   1         7       4
Tue   2         8       4

表2

ID  Subj
1 ch
2 ph
3 ph
4 ele
5 ch
6 ph
7 ph
8 Ele

出力例

Day   P1   P2   other

Mon   Ch   Ph   1
Mon   Ch   Ph   3
Tue   Ph   Ele  2
Tue   Ph   Ele  4
4

3 に答える 3

0

Max Functions と group by を削除します

SELECT dy, CASE WHEN period = 1 THEN subj ELSE NULL END AS P1, CASE WHEN period = 2 THEN subj ELSE NULL END AS P2
FROM クラス

于 2010-10-23T15:16:56.023 に答える
0

サンプル データと目的の出力が一致しません。Mth、CS2、Lab、および Hu の値は、出力のどこから来ていますか? それらは入力にありません。

何をしようとしているのかは完全には明らかではありませんが、(たとえば) 2 人の異なる学生を表す Mon の出力の個別の行を想定すると、SELECT リストと GROUP BY に識別列 (StudentID) を含める必要があります。句。次に、MAX を安全に使用して集計するのではなく (出力セルごとに 1 つの値しかないため)、代わりにエンジンをだましてピボットを実行させることができます。

学生 ID を含む SQL は次のとおりです。

SELECT student_id, dy,
     MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1,
     MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,    
FROM Classes
GROUP BY student_id, dy

これにより、生徒ごとに毎日のクラス スケジュールを示す 1 つのレコードが返されます。出力を日、学生の順で並べ替える場合は、SELECT 句と GROUP BY 句で Student_id と dy の順序を逆にします。

于 2010-10-23T16:34:26.777 に答える
0

信じられないかもしれませんが、MAX()すべての結果を取得するために集計関数を削除する必要はありません。必要なすべての結果が得られるように、GROUP BY 句に基準を追加するだけで、目的の行を取得できます。

たとえば、dyが一意の場合はすべての結果が得られますが、句を一意にする別の列がある場合は、GROUP BYそれを追加するだけですべての結果が得られます。列が「id」と呼ばれているとしましょう:

  SELECT dy,id,
         MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1,
         MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,    
    FROM Classes
GROUP BY dy, id
于 2010-10-23T15:19:49.843 に答える