- ベストアンサー
ストアドの作成のコツは?
普段はAccessMDBの開発が多いのですが、ADPでのプログラミングに挑戦しています。 TSQLの理解が浅く、ストアドの作成のコツがつかめません。ご教授頂けませんか? やりたいことは、 ユーザーテーブルにある月間の集計を集計用テーブルへ書き出したいのです。 条件としては、集計テーブルに該当月のデータがない場合は追加、ある場合は更新としたいのです。 Accessからは、コマンドボタンからユーザーIDと該当年、月をパラメータとして渡すことを考えています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
select 氏名 dateadd(mi, cast(substring(時間2,3,2) as int), dateadd(hh, cast(left(時間2,2) as int), [対象月]))- --AS 時間2 dateadd(mi, cast(substring(時間1,3,2) as int), dateadd(hh, cast(left(時間1,2) as int), [対象月])) --AS 時間1, from ・・・datediffは不要でした。
その他の回答 (3)
- sakko99
- ベストアンサー率63% (19/30)
もう解決されているかもしれませんが。 >集計元に時間2-時間1がある場合のものですよね。 時間がvarcharとはどのような持ち方ですか? 09:00→0900ですか? dateadd, left, substr, datediff 等の関数を調べてみてください。
補足
お世話になっております。実はまだ解決しておりません。 集計元は 氏名、日付、時間1、時間2とあり、以下のようなデータです。 太郎、2006/4/1、0900、1200 太郎、2006/4/2、1200、1700 次郎、2006/4/1、0900、1730 次郎、2006/4/2、0900、2130 この集計元から 太郎、2006/4、8 次郎、2006/4、21 のような集計を行いたいのです。 datediffを使う場合、日付と時間1、日付と時間2を結合して、日付型へ変換する必要がありそうですね。 となると、 Select 氏名,sum(datediff(日付+時間2,日付+時間1)) From 集計元 Where 日付>=2006/4/1 And 日付<=2006/4/30 Group by 氏名 といった感じでしょうか?
- sakko99
- ベストアンサー率63% (19/30)
>集計では、各レコードでの計算を行うつもりですが、 集計元テーブルの構成が分かりませんと、何とも。 何をどう集計したいのですか?
補足
お世話になっております。 説明不足で申し訳ありません。 データとしては、 名前(nvarchar(20)、日付(datetime)、時間1(nvarchar(4)、時間2(nvarchar(4)とありまして、 名前毎の時間2-時間1を計算し、月間の合計として集計を行いたいのです。 前の回答を頂いたサンプルでは、 集計元に時間2-時間1がある場合のものですよね。 この時間差もストアド内で行いたいと考えています。
- sakko99
- ベストアンサー率63% (19/30)
if(select(*) from Table1 where f_m=@m)>0 begin insert into Table1 (f_m, f_data) select m, sum(d) from Table2 where m=@m group by m end else begin update Table1 set fdata=d from Table1 T1 inner join ( select m, sum(d) from Table2 where m=@m group by m ) T2 on T1.f_m=T2.m end ・・・こんな感じですかね。うちではIF文で分岐させています。
補足
ご親切なサンプルをありがとうございます。 併せてもう一点ご教授頂きたいのですが、 集計では、各レコードでの計算を行うつもりですが、 VBAのレコードセットからループする方法しか思いつかないのですが、ストアドでもそのようにするものでしょうか?
お礼
何度もご丁寧にありがとうございました。 少しT_sqlが理解できたような気がします。