kutsulog様、trick様 ご回答ありがとうございます。
昨日は多忙で返信を行うことができませんでした。
当方側で一応解決にこぎつけた(詳しい方に助力した)ので、対応SQLなどを報告させていただきます。
やはりまた自分が勘違いしていた仕様が多かったことで、後だし的な説明になってしまうことをご了承下さい。
正直まだ全容を理解しきれていないので、解析などにお力を貸して頂けると幸いです。
--本SQLで、日付にもよりますが、約3分~4分で全データの抽出が完了しました。
DECLARE @EXEC_DATE AS NUMERIC
, @EXEC_DATETIME AS DATETIME
, @LAST_EOM AS NUMERIC
, @LAST_MONTH AS NUMERIC
, @START AS NUMERIC
, @MASTER_YM AS NUMERIC
SET @EXEC_DATE = (SELECT MAX(T10.[年月日])
FROM(
SELECT MAX(T01.[年月日]) AS [年月日] FROM [T].[DB].[地区在] T01 WHERE T01.[品種] = 'AT' AND T01.[内訳] NOT IN ('6', '9')
UNION ALL
SELECT MAX(T02.[年月日]) AS [年月日] FROM [T].[DB].[受注残] T02 WHERE T02.[品種] = 'AT' AND T02.[内訳] NOT IN ('6', '9')
) T10);
SET @EXEC_DATETIME = (SELECT (CONVERT(DATETIME,CAST(@EXEC_DATE AS VARCHAR),112)));
SET @LAST_MONTH = (SELECT LEFT(CAST(CONVERT(VARCHAR,EOMONTH(DATEADD(MONTH,-1,CONVERT(DATETIME,CAST(@EXEC_DATE AS VARCHAR),112))),112) AS NUMERIC),6));
SET @START = (SELECT CAST(CONCAT(@LAST_MONTH,'01') AS NUMERIC(8,0)));
/** 前月末日 **/
SET @LAST_EOM=(SELECT CAST(CONVERT(VARCHAR,EOMONTH(DATEADD(MONTH,-1,CONVERT(DATETIME,CAST(@EXEC_DATE AS VARCHAR),112))),112) AS NUMERIC));
/** (コードの親子関係などはデータ作成時の決まりごとなので、「下記で外部結合しているテーブルあるけど」「NULLかどうか判断してるけど」というあたりは、「万一NULLだったら補完してるよ」ぐらいに考えてください。
/** 物流_製品_親子マスタ参照用年月 // 物流_製品_親子マスタ(工場系)は過去マスタデータを蓄積するので、最新月しか持たないサイズ_処理_定義マスタ(地区系)と齟齬が起きないように使用年月を合わせています **/
SET @MASTER_YM=(SELECT MAX([年月]) FROM [T].[DB].[サイズ_処理_定義マスタ]);
WITH
/*********************************************************
日付範囲
**********************************************************/
[一時_日付範囲_前日] AS
(SELECT TOP 7 CAST(CONVERT(VARCHAR,DATEADD(DAY,-1,CONVERT(DATETIME,CAST([年月日] AS VARCHAR),112)),112) AS NUMERIC(8,0)) AS [年月日] FROM
(SELECT TOP 7 [年月日] FROM [T].[DB].[受注残] GROUP BY [年月日] ORDER BY [年月日] DESC
UNION
SELECT TOP 7 [年月日] FROM [T].[DB].[地区在] GROUP BY [年月日] ORDER BY [年月日] DESC
) X
ORDER BY [年月日] DESC
),
W_日付(Val,年月日,年月) AS(
SELECT CAST(DATEADD(DAY,-1,@EXEC_DATETIME ) AS DATE), CAST(CONVERT(NVARCHAR(10), DATEADD(DAY,-1,@EXEC_DATETIME ), 112) AS NUMERIC(8,0)), CAST(CONCAT(SUBSTRING(CONVERT(NVARCHAR(10), DATEADD(DAY,-1,@EXEC_DATETIME ), 112), 1, 6),'00') AS NUMERIC(8,0))
UNION ALL
SELECT DateAdd(day,-1,Val),CAST(CONVERT(NVARCHAR(10), DateAdd(day,-1,Val), 112) AS NUMERIC(8,0)), CAST(CONCAT(SUBSTRING(CONVERT(NVARCHAR(10), DateAdd(day,-1,Val), 112), 1, 6),'00') AS NUMERIC(8,0))
FROM W_日付
WHERE 年月日 > @START)
SELECT
T1.[年月日]
, T1.[倉庫コード]
, T1.[製品コード親]
, SUM(T1.[本数累計]) AS [本数]
FROM
(SELECT
CAST(CONVERT(VARCHAR,DATEADD(DAY,1,CONVERT(DATETIME,CAST( [年月日] AS VARCHAR),112)),112) AS NUMERIC(8,0)) AS [年月日] -- 例:20150928のデータ → 20150929の前日データ(抽出した[年月日]は、「前日データから見たら、当日データの年月日」なので、最終的に +1日している)
, [倉庫コード]
, [製品コード親]
, [本数累計]
FROM
(SELECT
[年月日]
, [倉庫コード]
, [製品コード親]
, SUM([出荷本数])
OVER(
PARTITION BY
[年月]
, [倉庫コード]
, [製品コード親]
ORDER BY
[年月日]
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS [本数累計]
FROM
(SELECT
WK1.[年月日]
, WK1.[年月]
, WK2.[出荷先コード] AS [倉庫コード]
, CASE
WHEN M0.[製品コード親] IS NULL THEN WK2.[製品コード]
ELSE M0.[製品コード親]
END AS [製品コード親]
, SUM(CASE
WHEN WK1.[年月日] = WK2.[年月日] THEN WK2.[出荷本数]
ELSE NULL
END
) AS [出荷本数]
FROM
W_日付 WK1
INNER JOIN
[T].[DB].[工場出荷] WK2
ON
WK2.[年月日] BETWEEN WK1.[年月] AND WK1.[年月] + 99
LEFT OUTER JOIN
[T].[DB].[物流_製品_親子マスタ] M0
ON
WK2.[製品コード] = M0.[製品コード]
AND @MASTER_YM = M0.[年月]
WHERE
WK2.[年月日] <>@LAST_EOM --毎月1日の前日データは空白にしたい = -1日である最終日は取得しない
GROUP BY
WK1.[年月日]
, WK1.[年月]
, WK2.[出荷先コード]
, CASE
WHEN M0.[製品コード親] IS NULL THEN WK2.[製品コード]
ELSE M0.[製品コード親]
END
) X
) Y
WHERE Y.[年月日] IN (SELECT [年月日] FROM [一時_日付範囲_前日])
AND Y.[本数累計] IS NOT NULL
UNION ALL
SELECT
CAST(CONVERT(VARCHAR,DATEADD(DAY,1,CONVERT(DATETIME,CAST( [年月日] AS VARCHAR),112)),112) AS NUMERIC(8,0)) AS [年月日]
, [倉庫コード]
, [製品コード親]
, [本数累計]
FROM
(SELECT
[年月日]
, [倉庫コード]
, [製品コード親]
, SUM([出荷本数])
OVER(
PARTITION BY
[年月]
, [倉庫コード]
, [製品コード親]
ORDER BY
[年月日]
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS [本数累計]
FROM
(SELECT
WK1.[年月日]
, WK1.[年月]
, WK2.[出荷先コード] AS [倉庫コード]
, CASE
WHEN M0.[製品コード親] IS NULL THEN WK2.[ストック製品コード親]
ELSE M0.[製品コード親]
END AS [製品コード親]
, SUM(CASE
WHEN WK1.[年月日] = WK2.[年月日] THEN (WK2.[出荷本数])
ELSE NULL
END
) AS [出荷本数]
FROM
W_日付 WK1
INNER JOIN
[T].[DB].[地区出荷] WK2
ON
WK2.[年月日] BETWEEN WK1.[年月] AND WK1.[年月] + 99
LEFT OUTER JOIN
[T].[DB].[サイズ_処理_定義マスタ] M0
ON
WK2.[ストック製品コード親] = M0.[ストック製品コード親]
WHERE
WK2.[年月日] <>@LAST_EOM
GROUP BY
WK1.[年月日]
, WK1.[年月]
, WK2.[出荷先コード]
, CASE
WHEN M0.[製品コード親] IS NULL THEN WK2.[ストック製品コード親]
ELSE M0.[製品コード親]
END
) X
) Y
WHERE Y.[年月日] IN (SELECT [年月日] FROM [一時_日付範囲_前日])
AND Y.[本数累計] IS NOT NULL
UNION ALL
SELECT
CAST(CONVERT(VARCHAR,DATEADD(DAY,1,CONVERT(DATETIME,CAST( [年月日] AS VARCHAR),112)),112) AS NUMERIC(8,0)) AS [年月日]
, [倉庫コード]
, [製品コード親]
, [本数累計]
FROM
(SELECT
[年月日]
, [倉庫コード]
, [製品コード親]
, SUM([入荷本数])
OVER(
PARTITION BY
[年月]
, [倉庫コード]
, [製品コード親]
ORDER BY
[年月日]
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS [本数累計]
FROM
(SELECT
WK1.[年月日]
, WK1.[年月]
, WK2.[出荷元コード] AS [倉庫コード]
, CASE
WHEN M0.[製品コード親] IS NULL THEN WK2.[ストック製品コード親]
ELSE M0.[製品コード親]
END AS [製品コード親]
, SUM(CASE
WHEN WK1.[年月日] = WK2.[年月日] THEN WK2.[入荷本数]*-1
ELSE NULL
END
) AS [入荷本数]
FROM
W_日付 WK1
INNER JOIN
[T].[DB].[地区入荷] WK2
ON
WK2.[年月日] BETWEEN WK1.[年月] AND WK1.[年月] + 99
LEFT OUTER JOIN
[T].[DB].[サイズ_処理_定義マスタ] M0
ON
WK2.[ストック製品コード親] = M0.[ストック製品コード親]
WHERE
WK2.[年月日] <>@LAST_EOM
GROUP BY
WK1.[年月日]
, WK1.[年月]
, WK2.[出荷元コード]
, CASE
WHEN M0.[製品コード親] IS NULL THEN WK2.[ストック製品コード親]
ELSE M0.[製品コード親]
END
) X
) Y
WHERE Y.[年月日] IN (SELECT [年月日] FROM [一時_日付範囲_前日])
AND Y.[本数累計] IS NOT NULL
)T1
GROUP BY
T1.[年月日]
, T1.[倉庫コード]
, T1.[製品コード親]
--以上、よろしくお願い致します。