2010-12-08 2 views
0

У меня есть таблица, в которой хранится информация о работе со студентом. Мне нужно выбрать часы на основе идентификатора studentID и идентификатора квартала. Вот что у меня есть:Как я могу сделать несколько операторов выбора в одной таблице?

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) в диспетчере сервера и получил ошибку:

«Подзапрос возвратил более 1 значения. Это недопустимо, если подзапрос следует за =,! =, <, < =,>, > = или когда подзапрос используется как выражение «

Любая помощь будет отличной. Благодаря!

EDIT:

в $ studentID генерируется в цикле в то время, так что я буду использовать часы на этом студент, прежде чем я перейду к следующему. Я получаю все часы для одного ученика в каждом квартале, добавляя их (это нужно делать за пределами sql), сохраняя результаты в переменной, а затем переходя к следующему ученику. Это работает отлично, когда я получаю 1 квартал, но у меня проблема, связанная со всеми кварталами.

EDIT Round 2: ли это в довольно ленивым, как я полагаю:

Я только что выбрали все часы и quarterID для конкретного студента. Затем пробежал некоторое время (odbc_fetch_row()). Если бы это был 201101, я добавил его в кучу $ q1, 201102 добавил в кучу $ q2 и так далее. Обработка немного медленнее, но не большая проблема с тем, что я делаю.

+0

Можете ли вы привести пример данных, что вы ожидаете вернуть и что возвращается? – Robb 2010-12-08 20:23:54

+0

На некоторых учениках я получаю часы на некоторых учеников, которых нет. В принципе, он должен вернуть часы, в которые студент вложил. Затем я использую данные, которые возвращены. – dcp3450 2010-12-08 20:28:36

ответ

1

пытается использовать SELECT TOP 1 или LIMIT 1 в запросе, в зависимости от того, какой sql вы используете.

EDIT Кроме того, почему вы пытаетесь достичь? Это кажется неуклюжим и, в зависимости от вашей цели, вероятно, лучший способ.

0
SELECT 
hours, SUBSTR(quarterId, 4, 2) 
FROM 
clinicalStudents 
WHERE 
quarterID IN ('201101', '201102', '201103', '201104') and studentID='$studentID' 

В зависимости от используемой базы данных, вам придется изменить функцию SubStr

1

я не уверен, что ваша цель ...

Может быть то, что вы действительно хотите:

select quarterID, sum(hours) 
from clinicalStudents 
where studentID='$studentID' 
group by 1 
0

EDIT on loop.

Не используйте для выполнения операции 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' 
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; 
Смежные вопросы