受注T
----------------
製品CD 得意先CD 数量 単価 受注日
0001 2001 500 3000 2013/7/5
0002 2002 1000 NULL 2013/9/25
0003 2003 1800 NULL 2013/9/25
単価M
----------------
製品CD 得意先CD 数量FROM 数量TO 単価 適用日
0001 2001 0 99999 3000 2013/5/1
0002 2002 0 500 800 2013/5/1
0002 2002 501 999999 500 2013/5/1
0003 2003 0 500 2000 2013/1/1
0003 2003 501 999999 1800 2013/1/1
0003 2003 0 500 2500 2013/9/20
というデータがあります。
受注Tの単価部分にデータがあるものとないものがあります。
受注時に単価Mから照合して単価を入れるのですが、受注時にまだ単価Mにない場合はNULLが
入っています。
そこで後日VIEWとして単価照合Vを作りたいです。
単価照合Vを作ったときにも単価MになければNULLのままでOKです。
て単価照合V
----------------
製品CD 得意先CD 数量 単価 受注日
0001 2001 500 3000 2013/9/27
0002 2002 1000 500 2013/9/25
0003 2003 2000 1800 2013/9/25
※2013/9/20に単価更新がありますが条件数量は0-500なので2013/1/1が適用
こんな感じです。
わからないのは受注数量、受注日と単価Mの照合です。
サブクエリを使えばSQLで1行に書けるのでしょうか?
お願いします。
No.2ベストアンサー
- 回答日時:
受注Tの単価がNULLの場合だけ単価Mから単価を引っぱってきたいという事ですよね?
単価Mの抽出条件としては、製品CD・得意先CDが受注Tと同じで、数量FROMと数量TOの範囲が受注Tの数量を含んでおり、適用日が受注Tの受注日以前で最新のものとなります。
例) ------------------------------------------
SELECT
製品CD,
得意先CD,
数量,
COALESCE(
単価,
(SELECT TOP 1 単価 FROM 単価M TK WHERE
JC.製品CD = TK.製品CD AND JC.得意先CD = TK.得意先CD AND
JC.数量 BETWEEN TK.数量FROM AND TK.数量TO AND
TK.適用日 <= JC.受注日
ORDER BY TK.適用日 DESC
)
) AS 単価,
受注日
FROM 受注T JC;
----------------------------------------------
OLAP関数を使えばもう少しスッキリするかも知れません。
No.3
- 回答日時:
こんにちは。
下記のSQLのようにしてみてください。
簡単にできると思います。
SELECT A.SIdx, A.TIdx, A.Cnt
, CASE WHEN A.Amount IS NULL THEN B.Amount ELSE A.Amount END AS Amount
, A.RegDate
FROM #TableT A WITH (NOLOCK)
LEFT OUTER JOIN #TableM B WITH (NOLOCK)
ON A.SIdx = B.SIdx AND A.TIdx = B.TIdx
AND A.Cnt >= B.CntFrom AND A.Cnt < B.CntTo
上記のSQLをテストするために質問内容を元に下記のSQLを準備しました。
実際に実行してご確認してください。
-- #### 一時テーブル作成
CREATE TABLE #TableT
(
SIdxvarchar(10)
,TIdxvarchar(10)
,Cntint
,Amount int
,RegDate datetime
)
GO
CREATE TABLE #TableM
(
SIdxvarchar(10)
,TIdxvarchar(10)
,CntFromint
,CntToint
,Amount int
,RegDate datetime
)
GO
-- #### データ登録
INSERT INTO #TableT
SELECT '0001', '2001', 500, 3000, '2013/7/5' UNION ALL
SELECT '0002', '2002', 1000, NULL, '2013/9/25' UNION ALL
SELECT '0003', '2003', 1800, NULL, '2013/9/25'
GO
INSERT INTO #TableM
SELECT '0001', '2001', 0, 99999, 3000, '2013/5/1' UNION ALL
SELECT '0002', '2002', 0, 500, 800, '2013/5/1' UNION ALL
SELECT '0002', '2002', 501, 999999, 500, '2013/5/1' UNION ALL
SELECT '0003', '2003', 0, 500, 2000, '2013/1/1' UNION ALL
SELECT '0003', '2003', 501, 999999, 1800, '2013/1/1' UNION ALL
SELECT '0003', '2003', 0, 500, 2500, '2013/9/20'
GO
-- #### 結果
SELECT A.SIdx, A.TIdx, A.Cnt
, CASE WHEN A.Amount IS NULL THEN B.Amount ELSE A.Amount END AS Amount
, A.RegDate
FROM #TableT A WITH (NOLOCK)
LEFT OUTER JOIN #TableM B WITH (NOLOCK)
ON A.SIdx = B.SIdx AND A.TIdx = B.TIdx
AND A.Cnt >= B.CntFrom AND A.Cnt < B.CntTo
ありがとうございました。
ODBC経由読み取り専用アカウントなのでテーブル作成ができません。
でもこんなやりかたもあるんですね。
テンポラリテーブルは、削除しなくても勝手に消えるんでしょうか?
No.1
- 回答日時:
SELECT 受注T.製品CD, 受注T.得意先CD, 受注T.数量, NULL, 受注T.受注日
FROM 受注T
WHERE NOT EXISTS (
SELECT *
FROM 単価M
WHERE 受注T.製品CD = 単価M.製品CD
AND 受注T.得意先CD = 単価M.得意先CD
AND 受注T.数量 >= 単価M.数量FROM
AND 受注T.数量 <= 単価M.数量TO
AND 受注T.受注日 >= 単価M.適用日
)
UNION ALL
SELECT 受注T.製品CD, 受注T.得意先CD, 受注T.数量, 単価M.単価, 受注T.受注日
FROM 受注T, 単価M
WHERE 受注T.製品CD = 単価M.製品CD
AND 受注T.得意先CD = 単価M.得意先CD
AND 受注T.数量 >= 単価M.数量FROM
AND 受注T.数量 <= 単価M.数量TO
AND 受注T.受注日 >= 単価.適用日
AND (EXISTS (
SELECT *
FROM 単価M M2
WHERE 受注T.製品CD = M2.製品CD
AND 受注T.得意先CD = M2.得意先CD
AND 受注T.数量 >= M2.数量FROM
AND 受注T.数量 <= M2.数量TO
AND 受注T.受注日 < M2.適用日
) OR
NOT EXISTS (
SELECT *
FROM 単価M M2
WHERE 単価M.製品CD = M2.製品CD
AND 単価M.得意先CD = M2.得意先CD
AND 単価M.数量 >= M2.数量FROM
AND 単価M.数量 <= M2.数量TO
AND 単価M.適用日 < M2.適用日
)
)
こんな感じ?
すごい脊髄反射的な回答になりましたが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel 関数 vlookupなどの使い方について質問です。 シート1に品番、商品名、単価、発注条 6 2022/06/15 19:16
- Excel(エクセル) Excel関数 情報引用する方法 4 2022/07/31 20:59
- その他(ビジネススキル・経営ノウハウ) 独占禁止法、下請法、優越的地位の乱用 1 2023/03/11 22:52
- Excel(エクセル) Excelグラフについて 1 2023/05/12 16:26
- Excel(エクセル) IFERROR、SMALL関数について 2 2022/08/22 23:40
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- その他(お金・保険・資産運用) 至急!【Wolt】各メニューの価格設定の簡単な計算方法 3 2023/03/05 11:58
- Excel(エクセル) エクセルの関数(式)を教えてください。 1 2022/09/27 09:28
- Excel(エクセル) 関数を教えてください。 2 2023/08/01 10:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXISTSを使ったDELETE文
-
Accessの実行時エラーについて
-
テーブル名の トラン マスタ...
-
ACCESSでクエリ作成時複数のフ...
-
ACCESS 商品毎の最新の単価を設...
-
1、Rstudioで回帰直線を求める...
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
外部参照してるキーを主キーに...
-
excel2013 MonthDays 関数が使...
-
for whichの使い方
-
SQLサーバから、項目の属性(型...
-
SELECT 文 GROUP での1件目を...
-
エクセルで最後の文字だけ置き...
-
1日に1人がこなせるプログラム...
-
SQLで特定の項目の重複のみを排...
-
処理件数を非表示にしたい
-
access2003 クエリSQL文に...
-
accessに対してSQL文を発行する...
-
カーソル0件の時にエラーを発生...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
Accessの実行時エラーについて
-
ACCESS ツリービューの作り方
-
日付により変動する「単価」を...
-
ACCESS 商品毎の最新の単価を設...
-
アクセス フィールド名に変数...
-
アクセスにて月末日付を取得し...
-
最大値を含むレコードの抽出
-
ACCESSでクエリ作成時複数のフ...
-
アクセスのフォーム上でのルッ...
-
ACCESSでDLookUpすると、不正な...
-
【SQL】あるマスタのレコードに...
-
前月の取得について
-
異なるデータベース間のテーブ...
-
サブクエリの書き方
-
アクセス★非課税、課税の合計金...
-
レスポンス向上のためのDB設計
-
inner join,left joi...
-
SQL2005 クエリ文について
おすすめ情報