• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL2000でのユーザ定義関数作成に関する質問です。)

SQL2000でのユーザ定義関数作成に関する質問です。

このQ&Aのポイント
  • SQL2000でのユーザ定義関数作成に関して質問があります。開発環境はvb6, SQLサーバ2000です。
  • 分類マスタと親テーブル、子テーブルを連結し、ユーザ定義関数を使用して会員ごとの分類別情報を集計したいと思っています。
  • 具体的には、会員CDごとに魚類、野菜、牛肉、豚肉の情報を持った結果を得たいと考えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

#1,#2です。補足です。 とりあえずお役に立てたなら何よりですが、「テーブル関数でもいい」ということは「SQL Serverにオブジェクトを作成してもいい」ということですよね。 テーブル関数がOKで、ストアドプロシージャはNGという理由が、特になければ、ストアドプロシージャの利用も検討してみてください。 SQL Serverは「ストアドプロシージャ内でSELECTした結果がレコードセットで受け取れる」という比較的珍しいDBMSです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

#1です。 必要なSQL文は以下の通りです。 SUMの部分が分類コードの数だけ必要なので「組み上げる」必要があるわけですが。 SELECT p.会員CD,p.会員名, SUM(CASE WHEN 分類CD=1 THEN 1 ELSE 0 END) [魚類], SUM(CASE WHEN 分類CD=2 THEN 1 ELSE 0 END) [野菜], SUM(CASE WHEN 分類CD=3 THEN 1 ELSE 0 END) [牛肉], SUM(CASE WHEN 分類CD=4 THEN 1 ELSE 0 END) [豚肉] FROM 親テーブル p LEFT OUTER JOIN 子テーブル c ON c.会員CD=p.会員CD GROUP BY p.会員CD,p.会員名 ORDER BY p.会員CD 呼び出す元はVBでもVBScriptでも何も変わらないのですが、前に書いた通り、 「戻りのカラム数が不定の場合、ユーザ定義関数では実現できません」。 ただ正直、使っている用語がかみ合っていないような気がしています。 ここで聞く以上、ユーザ定義関数って、SQL Serverのテーブル関数のことですよね? まさかVBのユーザ定義関数じゃないですよね?

urubou2008
質問者

お礼

再度のご回答ありがとうございます。 ユーザ定義関数はSQL Serverのテーブル関数のことです。 ただ、一度しか作成した事がなかったもので、カラム数が不定の物は作成できないというのが理解できていませんでした。 上記で教えていただいたSQLのSUM部分をプログラム内で動的に作成し、教えていただいたSQLを元にがんばってみようと思います! 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

戻りのカラム数が不定のクエリはユーザ定義関数では実現できません。 が、以下の通り、ストアドプロシージャならば実現できます。 動的クエリを組み上げて実行します。 CREATE PROCEDURE GETMATRIX AS BEGIN SET NOCOUNT ON DECLARE @sql varchar(8000) SELECT @sql=ISNULL(@sql+',','') +'SUM(CASE WHEN 分類CD='+CONVERT(varchar,分類CD)+' THEN 1 ELSE 0 END) ['+分類名+']' FROM 分類マスタ ORDER BY 分類CD SET @sql='SELECT p.会員CD,p.会員名,'+@sql +' FROM 親テーブル p' +' LEFT OUTER JOIN 子テーブル c ON c.会員CD=p.会員CD' +' GROUP BY p.会員CD,p.会員名' +' ORDER BY p.会員CD' EXEC (@sql) END VBからADOで呼ぶなら、ADODB.CommandのCommandTextに"EXEC GETMATRIX"をセットするか、 CommandTypeにadCmdStoredProcを指定した上で、CommandTextに"GETMATRIX"とセットするかしてください。 もう一つの留意点は、中でsql文を組みあげていますが、この組み上げたSQL文が8000バイトを超えると エラーになります(分類マスタの項目数によります)。その場合は、少し工夫が必要になります。

urubou2008
質問者

お礼

完全なこちらの記入ミスなのですが、vbScriptを使用して、ASPにて使用したいと思っています・・・ 申し訳ありません。 質問ばかりで申し訳ないのですが、下記のようなことはできませんでしょうか? 子供のテーブルのみを対象として -------------------------------------------------- 会員ID|魚類 |野菜 |牛肉 |豚肉 | -------------------------------------------------- 1   |1   |3   |1   |2   | -------------------------------------------------- 2   |4   |1   |0   |2   | -------------------------------------------------- 3   |0   |1   |3   |3   | -------------------------------------------------- のような結果をSQL文、もしくはユーザ定義関数を使用して実現することはできないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQLの質問です。

    下記のようなテーブルで、 レベル4以下で点数が入力されているMAXの行を持ってくるにはどうしたらよいでしょうか?よろしくお願いいたします。 職員番号 氏名 レベル 点数 01000 山田 花子 4 01000 山田 花子 3 40 01000 山田 花子 2 30 01000 山田 花子 1 20 01100 田中 あああ 4 10 01100 田中 あああ 3 20 01100 田中 あああ 2 30 01100 田中 あああ 1 40 01200 佐藤 あああ 4 01200 佐藤 あああ 3 01200 佐藤 あああ 2 30 01200 佐藤 あああ 1 40 この場合欲しい結果は 職員番号01000の人は点数40点の行、01100の人は点数10点の行、01200の人は点数30点の行  3行を表示したいです。

  • ユーザー定義関数作成について教えてください。

    開発環境はSQLサーバー2000、vb6です。 [MST_table_A] (都道府県マスター) _______________________ 都道府県CD | 都道府県名 -----------------------      1 | 大阪 -----------------------      2 | 名古屋 -----------------------      3 | 北海道 ----------------------- [TRN_table_B] (名物テーブル) _________________________________ 都道府県CD | 名物CD | 名物名 ---------------------------------     1 |   1 | たこ焼き ---------------------------------     1 |   2 | お好み焼き ---------------------------------     1 |   3 | 豚まん ---------------------------------     2 |   1 | ういろう ---------------------------------     2 |   2 | きしめん ---------------------------------     3 |   1 | ホタテ ---------------------------------     3 |   2 | カニ ---------------------------------     3 |   3 | じゃがいも --------------------------------- 質問なのですが、例えば上記のような親子関係のテーブル [MST_table_A] (都道府県マスター) [TRN_table_B] (名物テーブル)より、下記の様なマスター1レコードに対し、 子供の情報を1フィールド(Tab区切り)で取得する為には どのようなユーザー関数を作成し、どのように実行すれば実現することができるのでしょうか? [処理結果] __________________________________________________________________ 都道府県CD | 都道府県名 | ★名物名全データ★ ------------------------------------------------------------------     1 |    大阪 | たこ焼き vbTab お好み焼き vbTab 豚まん ------------------------------------------------------------------     1 |   名古屋 | ういろう vbTab きしめん ------------------------------------------------------------------     1 |   北海道 | ホタテ vbTab カニ vbTab じゃがいも ------------------------------------------------------------------

  • SQL文でのDISTINCT

    皆さん、はじめまして。 表題の件について、お分かりの方教えて下さい。 まず、テーブルですが テーブル名:table1 得意先CD 得意先名 受注番号 枝番 受注金額 custcd   custnm  jychuno  edano  amount -------------------------------------------- 000001   AAAAAAA 0000001  01   111111 000001   AAAAAAA 0000001  02   222222 000001   AAAAAAA 0000002  01   333333 000002   BBBBBBB 0000001  01   444444 のような、取引明細テーブルがあったとします。 ご覧頂いてお分かりの通り、得意先CD毎に受注番号が振られていて さらに枝番で管理されています。 (枝番が全て01から始まれば、それだけ選べば良いんですが・・・) この時、同一得意先で受注番号が重複するデータは省きたいのですが どうDISTINCTを入れれば良いのか分かりません。 上記例では、2行目だけを省きたいのです。 SELECT custcd , custnm , DISTINCT juchuno , edano , amount FROM table1 ORDERBY custcd , custnm , jychuno , edano; とするとエラーになります(当然)。 このような時って、どうすれば良いのでしょうか? 最近使い始めた素人ですので、宜しくお願い致します。

  • カテゴリと個別商品の集計SQLについて

    カテゴリと個別商品の集計SQLについて質問です。 postgresのバージョンは9.0です。 次のテーブルより ------------------------------------------ id  カテゴリ  商品名    日付       値 ------------------------------------------ 1  野菜    ホウレン草  2010-01-01  100 2  野菜    ホウレン草  2010-01-02  100 3  野菜    ホウレン草  2010-02-02  100 4  野菜    キャベツ    2010-01-02  200 5  肉      牛肉      2010-01-01  500 6  肉      牛肉      2010-01-02  500 -------------------------------------------- 下の結果を得るSQLを考えています。 月毎の値の集計 カテゴリ  商品名     1月  2月    合計   カテゴリ合計  カテゴリ合計と合計との差 ----------------------------------------------------------------------------- 野菜    ホウレン草   200  100    300    500        200 野菜    キャベツ     200    0    200    500        300 肉      牛肉      1000   0    1000   1000         0 ----------------------------------------------------------------------------- ここでカテゴリの合計とは 上の場合、 ホウレン草(300)+キャベツ(200)=カテゴリ野菜(500)、です。 クロス集計とサブクエリを使えば出来そうなのですが、カテゴリ合計を出す部分の SQLが思いつきません、よろしくお願い致します。

  • SQLで取得可能でしょうか

    SQLで取得可能でしょうか 今2つのテーブルがあるとします。 ---------------------- テーブル1  KEY    項目   1   テスト1   2   テスト2   3   テスト3 ----------------------- ---------------------- テーブル2   CD  名称    1   か   1   き   2   さ   2   し   2   す   3   た ----------------------- テーブル1のKEYはキーで重複しません。 テーブル2のCDは重複しますが、内容はテーブル1のKEYとリンクします。 今、テーブル1のKEY1件につき、データを1件取得したいのですが、 テーブル2の名称も取得したいです。 データは1件しか取得しない為、名称は、特定文字(例として/)で 区切って取得したいです。 期待したい結果 ----------------------  KEY  名称   1  か/き   2  さ/し/す   3  た ---------------------- このような取得は可能でしょうか? 尚、SQLの発行は1回のみで行いたいです。 よろしくお願いします。

  • SQLのチューニング

    テーブルのアップデートに3時間もかかってしまい困っています。 チューニングにより速度改善できそうであれば、 教えていただけませんでしょうか? UPDATE TABLE_A SET TABLE_A.MATI_CD = TABLE_B.MATI_CD, TABLE_A.UPD_DT = GETDATE(), TABLE_A.UPD_MOD = 'バッチXX' FROM TABLE_A INNER JOIN TABLE_B ON TABLE_A.KEN_CD = TABLE_B.KEN_CD AND TABLE_A.MATI_NM = TABLE_B.MATI_NM AND TABLE_B.NENDO = '2004' WHERE ( TABLE_A.MATI_CD IS NULL AND TABLE_A.MATI_NM <> '' OR TABLE_A.MATI_CD = '' AND TABLE_A.MATI_NM <> '' ) AND TABLE_A.CRE_DT >= '2004/04/01' TABLE_A KEN_CD ・・・ (key)県コード KEN_NM ・・・ 県名称 UKE_NO ・・・ (key)受付番号 EDA_NO ・・・ (key)受付番号枝番 MATI_CD・・・ 町コード MATI_NM・・・ 町名称 CRE_DT ・・・ データ新規作成日 CRE_MOD・・・ データ新規作成モジュール名 UPD_DT ・・・ データ更新日 UPD_MOD・・・ データ更新モジュール名 TABLE_B NENDO ・・・ (key)登録年度 MATI_CD・・・ (key)町コード MATI_NM・・・ 町名称 KEN_CD ・・・ 県コード CRE_DT ・・・ データ新規作成日 CRE_MOD・・・ データ新規作成モジュール名 UPD_DT ・・・ データ更新日 UPD_MOD・・・ データ更新モジュール名 TABLE_Aは受付記録を残すテーブルで、 現在およそ300万件入っています。 TABLE_Bは町コードのマスタテーブルで、 14000件入っています。 目的としては TABLE_Aの町コードがNULLで町名称が登録されている場合、 TABLE_Bのマスタから町コードを登録してやろうという修正バッチです。 これがTABLE_Bが大量データのためかわかりませんが、 3時間もかかってしまうんです。。。 何か良い手段はありませんでしょうか? ご助言お願いいたします。

  • SQLの作成を手伝っていただけませんか

    会社の組織構造を表す「組織テーブル」とそこに所属する社員を表す「社員テーブル」から、データを抽出したいのですが、わたしが設定しようとした条件とはまったく違う結果が返ってきてしまいます。あつかましいお願いですが、お手伝いいただけたら幸いです。 テーブルは以下のような構造です(*がプライマリーキイ)。 1. 組織テーブル ORGANISATIONS ORG__KEY*, ORG_NAME, ORG_TYPE 一つのレコードにプライマリーキイのほかに組織名と組織タイプが入っています。 2. 社員テーブル EMPLOYEES ORG__KEY*, EMP_NO*, EMP_NAME, SEXUALITY 組織のプライマリーキイとその組織に着任した順序を表すEMP_NOでレコードを特定します。名前と性別(MかFを入力)も登録されています。 抽出条件は常設タイプ(ORGANISATIONS.ORG_TYPE = 'PERM')の組織のうち、所属する社員が全て男性であるものは何かです。また、組織名に「事業部」という文字列を含まないことも条件です。 わたしの書いた以下のSQLでは社員のいない組織、つまり「組織テーブル」に登録されているだけで「社員テーブル」にレコードを持たない組織のIDが返ってきます。 select ORG__KEY from ORGANISATIONS a where ORG_TYPE = 'PERM' and not ORG_NAME like '%事業部%' and 'M' = all (select SEXUALITY from EMPLOYEES b where a.ORG__KEY = b.ORG__KEY) 男性社員だけの組織が存在しなければしないで、レコードを返さないようにSQLを書かなければならないのですが、どのように改善すればよいでしょうか。組織タイプや組織名の条件を外して検索すると、社員なし組織だけでなく、実際に男性社員だけの組織も取得できるので、まったく違うことをやっているわけではないとおもいますが、何かが足りないのでしょうか。 まだまだ初心者です。説明がこんがらかっているかもしれませんが、よろしくお願いします。

  • 次の条件を満たすSQL文をご教示下さい。

    テーブル名: list no | first_name | last_name | comment ----+------------+-----------+--------- 1 | 太郎 | 山田 | ほげ 2 | 次郎 | 田中 | ふが 3 | 花子 | 山田 | ぴよ 4 | 三郎 | 佐藤 | ぴよ 5 | 太郎 | 山田 | ぴよ 6 | 次郎 | 田中 | ふー 7 | 三郎 | 佐藤 | ふー 8 | 花子 | 山田 | ふー 上記の表から同じ”last_name”を持つ人の”first_name”と”last_name”を重複無しで抽出する(下記のような結果)SQL文は作成可能でしょうか。 結果 first_name | last_name ------------+----------- 太郎 | 山田 花子 | 山田 宜しくお願いします。

  • SQLのDISTINCTで重複チェック

    宜しくお願いします WindowsXP pro Office2000で作っています 現在 テーブルA,テーブルB共に ナンバー・氏名・住所の3つのフィールドがあり Aに ナンバー 氏名 住所 0    田中 長崎県 1    佐藤 長崎県 2    田中 長崎県 というデータがあるとして SELECT DISTINCT 氏名, 住所 FROM A の結果をBに入れたいのですが 入れるときにナンバーを一緒にいれたいと思っています 田中のナンバーは0と3がありますが 入れるのはどちらでも構いません これはSQL文で可能でしょうか? どのようにしたらいいのか教えてください 宜しく願いします

  • テーブル結合時の集計関数について

    環境:oracle 9i Oracleを触り始めて1週間程度の初心者です。 以下の3つのテーブルを外部結合し、集計結果を取得するSQL文をご教授いただけないでしょうか。COUNT関数やGROUP BY句などを使えばよさそう、というところまではわかるのですが、そこから先がどうも見当がつきません。。 どうぞ宜しくお願い致します。 【tbl1】 日付  社員名  摘要  労働時間 date sya_nm status  hours ------------------------------------------ 8/10  田中  出勤   8 8/15  田中  欠勤   0 8/20  田中  出勤   8 9/10  田中  出勤   8 8/20  佐藤  遅刻   6 8/25  高橋  出勤   8 【tbl2】 社員名 事業所 区分 時給 sya_nm jig_cd div pay ------------------------------------------ 田中   1  在籍 1000 佐藤   1  在籍 1000 鈴木   1  退職 1000 高橋   2  在籍 1000 【tbl3】 給与下限 給与上限  税 pay_from pay_to tax --------------------------------- 0    10000  100 10000 20000  200 ↓ 事業所(1)在籍者の8月分の支払情報をSelect文で取り出す。 (出勤日数=tbl1の出勤+遅刻) 社員名 出勤 欠勤 遅刻 時間  給与  税   ----------------------------------------------------------------- 田中   2  1  0  16 16000 200 佐藤   1  0  1   6  6000  100