アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっています。
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

A 回答 (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


これじゃできませんか?
あと、全角スペースは
ここ用に入れたものですか?

この回答への補足

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

>あと、全角スペースは
ここ用に入れたものですか?

そのつもりで入れたわけではないのですが・・・。
初歩的なことですみませんが、全角と半角のスペースを混ぜてしまうのはいけないのでしょうか??

補足日時:2004/06/14 14:17
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/08/20 10:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す