テーブル定義書がないので、自分で想像でデータベースの定義書を作り、テストデータも想像で作り。

だれがどの帳票を作るかも決まっておらず、こちとら、作業ができない状態なのです。

システム稼働まで3か月を切った今。

ギリギリで「さぁやって!!」と言われてもいいように、ひな形を作りまくってる。

このSQLもエラーや、変な出力してたので、15回作り直して、やっと満足のいく出力ができた。

1日1本ペースで作らないと、追いつかないのです。
そのペースでも追いつかないな、帳票200本あるし。

動的SQLは初めてだけれど、やってみると面白い。

DECLARE @loop_counter int
DECLARE @date_from varchar(max)
DECLARE @date_to   varchar(max)
DECLARE @date_diff int
DECLARE @date_now  varchar(max)
DECLARE @date_next varchar(max)
DECLARE @CAL_TABLE table(
     PlantCode varchar(5) NOT NULL
    ,LineCode varchar(2) NOT NULL
	,PartNumber varchar(20) NOT NULL
    ,CalDate datetime NOT NULL
)

set @loop_counter = 0
set @date_from = '2016/04/02'
set @date_to = '2016/05/03'

SELECT
    @date_diff =
	DATEDIFF(day,@date_from,@date_to) + 1

WHILE @loop_counter < @date_diff
    BEGIN
	    IF @loop_counter = 0
		    BEGIN
			    --INSERT INTO @CAL_TABLE VALUES ( @date_from )
				INSERT INTO @CAL_TABLE
				    SELECT DISTINCT
					     PlantCode
						,LineCode
						,PartNumber
						,@date_from
					FROM WORK_PERFORMANCE
				set @date_now  = @date_from
			END
		ELSE
		    BEGIN
		        SELECT @date_next = FORMAT(DATEADD(day,1,@date_now), 'yyyy/MM/dd')
			    --INSERT INTO @CAL_TABLE VALUES ( @date_next )
				INSERT INTO @CAL_TABLE
				    SELECT DISTINCT
					     PlantCode
						,LineCode
						,PartNumber
						,@date_next
					FROM WORK_PERFORMANCE
			    set @date_now = @date_next
		    END
	    
        set @loop_counter = @loop_counter + 1
    END

SELECT DISTINCT
	 CALTABLE.PlantCode AS PlantCode
	,CALTABLE.LineCode AS LineCode
	,CALTABLE.PartNumber AS PartNumber
	,CALTABLE.CalDate AS CalDate
	,FORMAT(CALTABLE.CalDate, 'MM') AS WorkMonth
	,FORMAT(CALTABLE.caldate, 'dd') AS WorkDate
	,CASE WHEN (DATENAME(weekday,CALTABLE.caldate) = '土曜日' OR DATENAME(weekday,CALTABLE.caldate) = '日曜日')
	 THEN '*' + FORMAT(CALTABLE.caldate, 'dd')
	 ELSE FORMAT(CALTABLE.caldate, 'dd') END AS YoubiAdd
    -- 予定数
    ,T2.NgrYotei AS NgrYotei
	-- 実績数
	,T3.NgrJisseki AS NgrJisseki
	-- 稼働率
	,CASE WHEN (T3.NgrJisseki IS NULL) OR (T3.NgrJisseki = 0) THEN 0 ELSE ROUND((CONVERT(FLOAT,T2.NgrYotei) / T3.NgrJisseki) * 100,2) END AS KadoRt
	-- 合格
	,CASE WHEN (T3.NgrJisseki - (CASE WHEN T4.NgrPeke IS NULL THEN 0 ELSE T4.NgrPeke END)) < 0 THEN 0
	 ELSE (T3.NgrJisseki - (CASE WHEN T4.NgrPeke IS NULL THEN 0 ELSE T4.NgrPeke END)) END AS OKJisskeki
	,CASE WHEN T4.NgrPeke IS NULL THEN 0 ELSE T4.NgrPeke END AS NgrPeke
	-- 合格数
	,CASE WHEN (T3.NgrJisseki IS NULL) OR (T3.NgrJisseki = 0) THEN 0 ELSE 
	    CASE WHEN (T3.NgrJisseki - (CASE WHEN T4.NgrPeke IS NULL THEN 0 ELSE T4.NgrPeke END)) < 0 THEN 0
		ELSE ROUND((CONVERT(FLOAT,(T3.NgrJisseki - (CASE WHEN T4.NgrPeke IS NULL THEN 0 ELSE T4.NgrPeke END))) / T3.NgrJisseki) * 100,2) END END AS Budomari

FROM
WORK_PERFORMANCE AS T1

-- 予定数
INNER JOIN (
SELECT
     PlantCode AS PlantCode
	,LineCode  AS LineCode
	,PartNumber AS PartNumber
	,Date
	,SUM(Qty) AS NgrYotei
FROM
MOLDING_PLAN T2
GROUP BY PlantCode, LineCode, PartNumber, Date
) T2 ON
    T1.PlantCode = T2.PlantCode
AND T1.LineCode = T2.LineCode
AND FORMAT(T1.WorkDate, 'yyyy/MM/dd') = FORMAT(T2.Date, 'yyyy/MM/dd')
AND T1.ProcessCode = '01'
AND T1.PartNumber = T2.PartNumber

-- 実績数
LEFT OUTER JOIN (
SELECT
     PlantCode AS PlantCode
	,LineCode  AS LineCode
	,PartNumber AS PartNumber
	,WorkDate AS WorkDate
	,SUM(Qty) AS NgrJisseki
FROM
WORK_PERFORMANCE T3
WHERE
ProcessCode = '01'
GROUP BY PlantCode, LineCode, PartNumber, WorkDate
) T3 ON
    T1.PlantCode = T3.PlantCode
AND T1.LineCode = T3.LineCode
AND FORMAT(T1.WorkDate, 'yyyy/MM/dd') = FORMAT(T3.WorkDate, 'yyyy/MM/dd')
AND T1.PartNumber = T3.PartNumber

-- 破損数
LEFT OUTER JOIN (
SELECT
     PlantCode AS PlantCode
	,LineCode  AS LineCode
	,PartNumber AS PartNumber
	,WorkDate AS WorkDate
	,SUM(Qty) AS NgrPeke
FROM
WORK_PERFORMANCE
WHERE
    ProcessCode = '01'
AND WorkPerformanceResultCode = '02'
GROUP BY PlantCode, LineCode, PartNumber, WorkDate
) T4 ON
    T1.PlantCode = T4.PlantCode
AND T1.LineCode = T4.LineCode
AND FORMAT(T1.WorkDate, 'yyyy/MM/dd') = FORMAT(T4.WorkDate, 'yyyy/MM/dd')
AND T1.PartNumber = T4.PartNumber

RIGHT OUTER JOIN @CAL_TABLE CALTABLE ON
    T1.PlantCode = CALTABLE.PlantCode
AND T1.LineCode = CALTABLE.LineCode
AND T1.PartNumber = CALTABLE.PartNumber
AND FORMAT(T1.WorkDate, 'yyyy/MM/dd') = FORMAT(CALTABLE.caldate, 'yyyy/MM/dd')

ORDER BY FORMAT(CALTABLE.CalDate, 'MM'),FORMAT(CALTABLE.CalDate, 'dd') ASC