0

学生の作業情報を保存するテーブルがあります。StudentID と四半期 ID に基づいて時間を選択する必要があります。ここに私が持っているものがあります:

SELECT
(SELECT hours FROM clinicalStudents WHERE quarterID='201101' and studentID='$studentID') as q1,             
(SELECT hours FROM clinicalStudents WHERE quarterID='201102' and studentID='$studentID') as q2,             
(SELECT hours FROM clinicalStudents WHERE quarterID='201103' and studentID='$studentID') as q3,             
(SELECT hours FROM clinicalStudents WHERE quarterID='201104' and studentID='$studentID') as q4

それは私にいくつかの数字を与えているだけで、すべてではありません。サーバー マネージャーでこれを (WHERE 句を除いて) 実行したところ、エラーが発生しました。

「サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません」

どんな援助も素晴らしいでしょう。ありがとう!

編集:

$studentID は while ループで生成されるため、次の生徒に移動する前にその生徒の時間を使用しています。四半期ごとに 1 人の学生のすべての時間を取得し、それらを追加し (これは SQL の外部で行う必要があります)、結果を変数に格納してから、次の学生に移動します。これは、1 四半期を取得すると完璧に機能しますが、すべての四半期を取得するのに問題があります。

編集ラウンド2:私が推測するかなり怠惰な方法でそれをしました:

特定の生徒のすべての時間と QuarterID を選択しました。その後、while(odbc_fetch_row()) を実行しました。それが 201101 だった場合、$q1 の山に追加し、201102 を $q2 の山に追加する、などです。処理は少し遅くなりますが、私がやっていることには大きな問題はありません。

4

5 に答える 5

1

実行しているSQLに応じて、クエリでaSELECT TOP 1またはaを使用しようとしています。LIMIT 1

編集 また、なぜあなたは達成しようとしていますか? これは不格好に思えますが、意図した目的によっては、おそらくより良い方法が利用可能です。

于 2010-12-08T20:23:52.040 に答える
1

私はあなたの目標が何であるか分かりません...

多分あなたが本当に欲しいのは:

select quarterID, sum(hours) 
from clinicalStudents 
where studentID='$studentID' 
group by 1
于 2010-12-08T20:29:21.230 に答える
0
SELECT 
hours, SUBSTR(quarterId, 4, 2)
FROM 
clinicalStudents 
WHERE 
quarterID IN ('201101', '201102', '201103', '201104') and studentID='$studentID'

使用しているデータベースに応じて、関数 SUBSTR を変更する必要があります

于 2010-12-08T20:27:45.403 に答える
0

ループで編集。

ループを使用して SUM 演算を実行しないでください。代わりにSUM集計操作を使用してください

では、各四半期を各列に射影できます。

   SELECT
 cs.studentid , q1.hours Q1, q2.hours Q2, q3.hours Q3, q4.hours Q4
    FROM 
    clinicalStudents cs
    (SELECT SUM(hours) hours , studentID 
     FROM clinicalStudents 
     WHERE quarterID='201101' and studentID='$studentID' 
     GROUP BY studentID ) q1
    LEFT join on cs.studentID = q1.clinicalStudents 
    (SELECT SUM(hours) hours , studentID  
     FROM clinicalStudents WHERE quarterID='201102' and studentID='$studentID' 
    GROUP BY studentID )  q2
    LEFT join on cs.studentID = q2.clinicalStudents              
    (SELECT SUM(hours) hours  , studentID 
     FROM clinicalStudents 
     WHERE quarterID='201103' and studentID='$studentID'
     GROUP BY studentID ) q3             
    LEFT join on cs.studentID = q3.clinicalStudents              
    (SELECT SUM(hours) hours , studentID 
     FROM clinicalStudents 
     WHERE quarterID='201104' and studentID='$studentID' GROUP BY studentID ) q4
    LEFT join on cs.studentID = q4.clinicalStudents          
    WHERE cs.studentID='$studentID'
于 2010-12-08T20:30:55.993 に答える
0

これを試して。

select studentID
      ,sum(case when quarterID = '201101' then hours end) as q1
      ,sum(case when quarterID = '201102' then hours end) as q2
      ,sum(case when quarterID = '201103' then hours end) as q3
      ,sum(case when quarterID = '201104' then hours end) as q4
  from clinicalStudents
 where quarterID in('201101', '201102', '201103', '201104')
 group by studentID;
于 2010-12-08T22:07:05.067 に答える