116 lines
3.6 KiB
TypeScript
116 lines
3.6 KiB
TypeScript
/**
|
||
* This will return the material demand per day
|
||
* startdate and end date should be passed over
|
||
*/
|
||
export const materialPerDay = `
|
||
use [test3_AlplaPROD2.0_Read]
|
||
|
||
DECLARE @ShiftStartHour INT = 6
|
||
declare @startDate nvarchar(max) = '[startDate]'
|
||
declare @endDate nvarchar(max) = '[endDate]'
|
||
;with Calendar as (
|
||
select cast(@startDate as date) CalDate
|
||
union all
|
||
select dateadd(day,1,CalDate)
|
||
from Calendar
|
||
where CalDate < @endDate
|
||
),
|
||
DailySplit AS (
|
||
SELECT
|
||
-- Lot fields
|
||
l.Id AS ProductionLotId,
|
||
l.ProductionLotHumanReadableId,
|
||
l.ArticleHumanReadableId,
|
||
l.ArticleDescription,
|
||
l.LocationId,
|
||
l.MachineHumanReadableId,
|
||
l.MachineDescription,
|
||
l.StartDate,
|
||
l.FinishDate,
|
||
l.ProductionCustomerDescription,
|
||
l.ProductionCustomerHumanReadableId,
|
||
l.PlannedQuantity,
|
||
l.PlannedLoadingUnit,
|
||
l.Cavity,
|
||
l.Utilisation,
|
||
l.TotalMaterialDemand AS LotTotalMaterialDemand,
|
||
|
||
-- Material fields
|
||
m.MaterialHumanReadableId,
|
||
m.MaterialDescription,
|
||
m.TotalDemand AS LotMaterialTotalDemand,
|
||
c.CalDate,
|
||
|
||
DATEDIFF(SECOND,l.StartDate,l.FinishDate) AS LotDurationSec,
|
||
|
||
-- build shift‑based 24‑hour window (e.g. 06:00 → next day 06:00)
|
||
CASE
|
||
WHEN l.StartDate > DATEADD(HOUR,@ShiftStartHour,CAST(c.CalDate AS DATETIME2(7)))
|
||
THEN l.StartDate
|
||
ELSE DATEADD(HOUR,@ShiftStartHour,CAST(c.CalDate AS DATETIME2(7)))
|
||
END AS DayStart,
|
||
|
||
CASE
|
||
WHEN l.FinishDate < DATEADD(SECOND,-0.0000001,
|
||
DATEADD(HOUR,@ShiftStartHour,
|
||
DATEADD(DAY,1,CAST(c.CalDate AS DATETIME2(7)))))
|
||
THEN l.FinishDate
|
||
ELSE DATEADD(SECOND,-0.0000001,
|
||
DATEADD(HOUR,@ShiftStartHour,
|
||
DATEADD(DAY,1,CAST(c.CalDate AS DATETIME2(7)))))
|
||
END AS DayEnd
|
||
FROM [issueMaterial].[ProductionLot] (nolock) AS l
|
||
LEFT JOIN [issueMaterial].[MaterialDemand] (nolock) AS m
|
||
ON m.ProductionLotId = l.Id
|
||
CROSS JOIN Calendar AS c
|
||
WHERE DATEADD(HOUR,@ShiftStartHour,CAST(c.CalDate AS DATETIME2))
|
||
< l.FinishDate
|
||
AND DATEADD(HOUR,@ShiftStartHour+24,CAST(c.CalDate AS DATETIME2))
|
||
> l.StartDate
|
||
--and l.[ProductionLotHumanReadableId] = 26364
|
||
),
|
||
Fraction AS (
|
||
SELECT
|
||
ds.*,
|
||
DATEDIFF(SECOND,ds.DayStart,ds.DayEnd) AS OverlapSec
|
||
FROM DailySplit ds
|
||
),
|
||
Normalized AS (
|
||
SELECT
|
||
f.*,
|
||
f.OverlapSec * 1.0 /
|
||
NULLIF(SUM(f.OverlapSec) OVER
|
||
(PARTITION BY f.ProductionLotId, f.MaterialHumanReadableId),0)
|
||
AS NormalizedFraction
|
||
FROM Fraction f
|
||
)
|
||
SELECT
|
||
n.ProductionLotId,
|
||
n.ProductionLotHumanReadableId,
|
||
n.ArticleHumanReadableId,
|
||
n.ArticleDescription,
|
||
n.LocationId,
|
||
n.MachineHumanReadableId,
|
||
n.MachineDescription,
|
||
n.StartDate,
|
||
n.FinishDate,
|
||
n.ProductionCustomerDescription,
|
||
n.ProductionCustomerHumanReadableId,
|
||
n.PlannedQuantity,
|
||
n.PlannedLoadingUnit,
|
||
n.Cavity,
|
||
n.Utilisation,
|
||
n.LotTotalMaterialDemand,
|
||
n.MaterialHumanReadableId,
|
||
n.MaterialDescription,
|
||
n.LotMaterialTotalDemand,
|
||
n.CalDate,
|
||
n.NormalizedFraction * n.LotMaterialTotalDemand AS DailyMaterialDemand
|
||
FROM Normalized n
|
||
ORDER BY
|
||
n.MaterialHumanReadableId,
|
||
n.CalDate,
|
||
n.ProductionLotHumanReadableId
|
||
OPTION (MAXRECURSION 0);
|
||
`;
|