2011-01-19 8 views
1

このSQLクエリをPerl DBIx::Classコードに変換するにはどうすればよいですか?あなたは自動的に膨張しているかどうか、どのようにしてCOUNT、SUM、CASE、およびBETWEENを使用してこのSQLクエリをPerl 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(); 

もちろん日時ビットがあなたのdatetimeフォーマットに依存します:

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 :: Classです。 – Justin

答えて

1

あなたはDBIx ::クラスを意味していること、そして、私はおそらくのようなもののために行くだろうと仮定すると、 /収縮する日付など

+0

これは2つの別のクエリですね。ヤック – ysth

+0

この回答はこれまでのところ私のテストに合格しています。ありがとうございました! – Justin

+1

@ysth - はい、それは2つの別々のクエリですが、読みやすくテストしやすく、DBIx :: Classに準拠しています。つまり、SQLクエリを直接レプリケートするのではなく、一致するオブジェクトの結果セットを扱います。 DBIx :: Classで使用されているSQL :: Abstractを使用して複雑なクエリを構築することは、(SQLのセクションを直接渡すこと以外の)非常に不満で、時には不可能なこともあります。彼らが重いクエリだった場合、私はそれらを試して組み合わせるだろうが、有益にインデックスを作成したテーブルのCOUNT()は問題ではないはずです。 – plusplus

関連する問題