- 締切済み
ストアドプロシージャによる動的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
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kakusuke
- ベストアンサー率36% (95/259)
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 これじゃできませんか? あと、全角スペースは ここ用に入れたものですか?
お礼
仮テーブルを作成し、一度、insertしてから抽出するように回避しました。
補足
回答ありがとうございます。 うまく、やりたいことを書けなくてすみません。 確かに、一つずつ書いていけばよいのですが、 クロス集計のような表を作りたいのです。 表のイメージとして |0~5時|6時|・・・|20時|21~23時 | ------------------------------------------ 0~5時 | | | | | | 6時 | | | | | | 7時 | | | | | | ・ | | | | | | ・ | | | | | | ・ | | | | | | 18時 | | | | | | 19時 | | | | | | 20時 | | | | | | 21~23時 | | | | | | としたいので、全てのSQLを書いてしまうと・・・ 長すぎてしまいます。 そこで、短く、見やすいように書けないかと思い、 質問させて頂きました。 >あと、全角スペースは ここ用に入れたものですか? そのつもりで入れたわけではないのですが・・・。 初歩的なことですみませんが、全角と半角のスペースを混ぜてしまうのはいけないのでしょうか??