• 締切済み

ストアドプロシージャによる動的SQLについて

いつもお世話になっています。 SQLServer・ストアドプロシージャの、WHERE句を動的にしたいのですがうまくできません。 やりたいことは、履歴テーブルの受付、回答が済んでいる件数を取得したいのです。 回答時間は0時から5時までを一まとめ、20時から23時を一まとめ、その他は一時間毎に抽出したいのです。 CASE文で書いたのですが、エラーが起こってしまいます。 どのように書いたらよいのかご教授下さい。 受付時間が8時代の件数を取得する時、 このように書きました。 DECLARE @from_date datetime DECLARE @to_date_last datetime DECLARE @answer_count int SET @from_date = '2004/04/06' SET @to_date_last = '2004/06/05' SET @answer_time = 9 SELECT Count(R.受付時間) FROM 履歴 AS R WHERE LEFT(CONVERT ( varchar(20) ,R.受付時間, 8),2) = '08'    AND R.受付時間 between @from_date and @to_date_last CASE  WHEN @answertime = 5 THEN    AND LEFT(CONVERT ( varchar(20) ,R.回答時間, 8),2) <= '0' + LEFT( Convert(varchar(20),@answer_time),1)  WHEN @answertime > 5 AND @answertime < 10 THEN    AND LEFT(CONVERT ( varchar(20) ,R.回答時間, 8),2) = '0' + LEFT( Convert(varchar(20),@answer_time),1)  WHEN @answertime > 10 AND @answertime < 20 THEN    AND LEFT(CONVERT ( varchar(20) ,R.回答時間, 8),2) = Convert(varchar(20),@answer_time)  WHEN @answertime = 20 THEN    AND LEFT(CONVERT ( varchar(20) ,R.回答時間, 8),2) >= Convert(varchar(20),@answer_time) END

みんなの回答

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.1

DECLARE @from_date datetime DECLARE @to_date_last datetime DECLARE @answer_count int SET @from_date = '2004/04/06' SET @to_date_last = '2004/06/05' SET @answer_time = 9 CASE WHEN @answertime = 5 THEN SELECT Count(R.受付時間) FROM 履歴 AS R WHERE LEFT(CONVERT ( varchar(20), R.受付時間, 8), 2) = '08' AND R.受付時間 between @from_date and @to_date_last AND LEFT(CONVERT ( varchar(20), R.回答時間, 8),2) <= '0' + LEFT( Convert(varchar(20), @answer_time), 1) WHEN @answertime > 5 AND @answertime < 10 THEN SELECT Count(R.受付時間) FROM 履歴 AS R WHERE LEFT(CONVERT ( varchar(20), R.受付時間, 8), 2) = '08' AND R.受付時間 between @from_date and @to_date_last AND LEFT(CONVERT ( varchar(20), R.回答時間, 8),2) = '0' + LEFT( Convert(varchar(20), @answer_time), 1) WHEN @answertime > 10 AND @answertime < 20 THEN SELECT Count(R.受付時間) FROM 履歴 AS R WHERE LEFT(CONVERT ( varchar(20), R.受付時間, 8), 2) = '08' AND R.受付時間 between @from_date and @to_date_last AND LEFT(CONVERT ( varchar(20), R.回答時間, 8),2) = Convert(varchar(20), @answer_time) WHEN @answertime = 20 THEN SELECT Count(R.受付時間) FROM 履歴 AS R WHERE LEFT(CONVERT ( varchar(20), R.受付時間, 8), 2) = '08' AND R.受付時間 between @from_date and @to_date_last AND LEFT(CONVERT ( varchar(20), R.回答時間, 8),2) >= Convert(varchar(20), @answer_time) END これじゃできませんか? あと、全角スペースは ここ用に入れたものですか?

makitty
質問者

お礼

仮テーブルを作成し、一度、insertしてから抽出するように回避しました。

makitty
質問者

補足

回答ありがとうございます。 うまく、やりたいことを書けなくてすみません。 確かに、一つずつ書いていけばよいのですが、 クロス集計のような表を作りたいのです。 表のイメージとして      |0~5時|6時|・・・|20時|21~23時 | ------------------------------------------ 0~5時  |   |  |   |  |     | 6時    |   |  |   |  |     | 7時    |   |  |   |  |     | ・     |   |  |   |  |     | ・     |   |  |   |  |     | ・     |   |  |   |  |     | 18時   |   |  |   |  |     | 19時   |   |  |   |  |     | 20時   |   |  |   |  |     | 21~23時 |   |  |   |  |     | としたいので、全てのSQLを書いてしまうと・・・ 長すぎてしまいます。 そこで、短く、見やすいように書けないかと思い、 質問させて頂きました。 >あと、全角スペースは ここ用に入れたものですか? そのつもりで入れたわけではないのですが・・・。 初歩的なことですみませんが、全角と半角のスペースを混ぜてしまうのはいけないのでしょうか??