2011-01-19 9 views
1

Как я могу преобразовать этот SQL-запрос в Perl DBIx::Class?Как преобразовать этот SQL-запрос с помощью COUNT, SUM, CASE и BETWEEN в Perl DBIx :: Class?

SELECT COUNT(*) AS num_grads, 
     SUM(CASE WHEN employment_status = 1 THEN 1 ELSE 0 END) AS num_employed 
    FROM students 
WHERE status = 6 -- 6 means they graduated 
    AND grad_date BETWEEN Convert(datetime, ?) AND Convert(datetime, ?) 
+1

Вы имеете в виду DBIx :: Class? –

+0

Да, DBIx :: Класс. – Justin

ответ

1

Предполагая, что вы имеете в виду DBIx :: Class, то я бы, вероятно, пойти на что-то вроде:

my $rs = My::Schema->resultset('Students') # 
    ->search({ 
     status => 6, 
     grad_date => { 'between' => [ $start_dt, $end_dt ] }, 
    }); 

my $num_grads = $rs->count(); 
my $num_employed = $rs->search({ employment_status => 1 })->count(); 

Конечно бит даты и времени будет зависеть от ваших форматов даты и времени, будь вы автоматически надувать/deflating datetimes etc

+0

Это два отдельных вопроса, не так ли? Тьфу. – ysth

+0

Этот ответ проходит мои тесты. Спасибо! – Justin

+1

@ysth - да, это два отдельных запроса, но их легко читать и тестировать, и они в большей степени соответствуют DBIx :: Class - т. Е. Вы имеете дело с наборами результатов сопоставления объектов, а не пытаетесь напрямую реплицировать SQL-запросы. Создание сложных запросов с помощью SQL :: Abstract, используемое DBIx :: Class, может быть довольно неприятным, а иногда и невозможным (кроме непосредственного прохождения разделов SQL). Если бы они были тяжелыми запросами, я бы попытался их объединить, но COUNT() в правильно индексированной таблице не должен быть проблемой. – plusplus

 Смежные вопросы

  • Нет связанных вопросов^_^