売上年月を受け取り、その年月に売上のあった商品コードのテーブル返す
[GetSoldItems]というテーブル値関数を作成します
以下は売上テーブルです。
実行するスクリプト
CREATE FUNCTION [GetSoldItems]
(
@FROM datetime,
@TO datetime
)
RETURNS @SoldItems TABLE (
商品ID NCHAR(10) NOT NULL
)
AS
BEGIN
INSERT INTO @SoldItems ( 商品ID )
SELECT DISTINCT 商品ID FROM 売上 WHERE 売上日 BETWEEN @FROM AND @TO
RETURN;
END
上記スクリプトを実行すると、以下のようにテーブル値関数が作成されます。
実行結果
SELECT * FROM 商品マスタ
INNER JOIN dbo.GetSoldItems('2023-11-01 00:00:00', '2023-11-30 00:00:00') 売上済商品
ON 商品マスタ.商品ID = 売上済商品.商品ID
引数で指定した年月に売上のあった商品コードを取得することができました。
ポイント
テーブル値関数について
- テーブル値関数の最後のステートメントはRETURNです。
- テーブルの値を更新・挿入・削除するようなステートメントは記載できません。
- テーブル値関数を作成する構文は以下の通りです。
CREATE FUNCTION [ ファンクション名 ] (
[ @入力パラメーター名1 ] [ 入力パラメーター名1のデータ型 ],
[ @入力パラメーター名2 ] [ 入力パラメーター名2のデータ型 ],
[ @入力パラメーター名3 ] [ 入力パラメーター名3のデータ型 ]
)
RETURNS [ @戻り値のテーブル名 ] TABLE (
[カラム名1] [カラム名1のデータ型] [NULL or NOT NULLなどのテーブル定義],
[カラム名2] [カラム名2のデータ型] [NULL or NOT NULLなどのテーブル定義],
[カラム名3] [カラム名3のデータ型] [NULL or NOT NULLなどのテーブル定義]
)
AS
BEGIN
[ ファンクションで処理したい一連のT-SQLステートメント
@戻り値のテーブルに値をインサートする ]
RETURN;
END;
DISTINCTについて
- 重複したレコードを一行にまとめることができます。
SELECT DISTINCT 商品ID FROM 売上