Вы можете попробовать следующий подход. Основная часть заключается в том, что каждая строка преобразуется в таблицу из 12 строк с дополнительным столбцом Increase
и соответствующим предложением WHERE
.
Введите:
CREATE TABLE #SampleData(
ID VARCHAR(10),
val1 INT,
val2 INT,
val3 INT,
val4 INT,
val5 INT,
val6 INT,
val7 INT,
val8 INT,
val9 INT,
val10 INT,
val11 INT,
val12 INT,
startValue INT,
endValue INT
);
INSERT INTO #SampleData
(ID,val1,val2,val3,val4,val5,val6,val7,val8,val9,val10,val11,val12,startValue,endValue)
VALUES
(1001,3,2,1,0,1,2,3,0,0,0,0,0,1,7),
(1002,1,2,3,4,0,0,0,1,2,3,0,0,1,12),
(1003,0,3,2,1,0,0,0,0,0,0,0,0,1,12),
(1004,0,1,2,3,4,0,0,0,0,0,0,0,3,9),
(1005,1,1,1,1,2,3,2,2,1,1,0,0,1,8),
(1006,1,2,3,4,4,0,7,0,9,10,0,12,1,12)
T-SQL:
;WITH PreparationCTE AS (
SELECT
s.ID,
v.Increase,
ROW_NUMBER() OVER (PARTITION BY s.ID ORDER BY v.Nmr) AS Rn1,
SUM(CASE WHEN v.Increase = -1 THEN 0 ELSE 1 END) OVER (PARTITION BY s.ID ORDER BY v.Nmr) AS Rn2
FROM #SampleData s
CROSS APPLY (VALUES
(1, Val1, CASE WHEN Val1 < Val2 THEN 1 WHEN Val1 = Val2 THEN 0 ELSE -1 END),
(2, Val2, CASE WHEN Val2 < Val3 THEN 1 WHEN Val2 = Val3 THEN 0 ELSE -1 END),
(3, Val3, CASE WHEN Val3 < Val4 THEN 1 WHEN Val3 = Val4 THEN 0 ELSE -1 END),
(4, Val4, CASE WHEN Val4 < Val5 THEN 1 WHEN Val4 = Val5 THEN 0 ELSE -1 END),
(5, Val5, CASE WHEN Val5 < Val6 THEN 1 WHEN Val5 = Val6 THEN 0 ELSE -1 END),
(6, Val6, CASE WHEN Val6 < Val7 THEN 1 WHEN Val6 = Val7 THEN 0 ELSE -1 END),
(7, Val7, CASE WHEN Val7 < Val8 THEN 1 WHEN Val7 = Val8 THEN 0 ELSE -1 END),
(8, Val8, CASE WHEN Val8 < Val9 THEN 1 WHEN Val8 = Val9 THEN 0 ELSE -1 END),
(9, Val9, CASE WHEN Val9 < Val10 THEN 1 WHEN Val9 = Val10 THEN 0 ELSE -1 END),
(10, Val10, CASE WHEN Val10 < Val11 THEN 1 WHEN Val10 = Val1 THEN 0 ELSE -1 END),
(11, Val11, CASE WHEN Val11 < Val12 THEN 1 WHEN Val11 = Val2 THEN 0 ELSE -1 END),
(12, Val12, 0)
) v(Nmr, Val, Increase)
WHERE (s.startValue <= v.Nmr) AND (v.Nmr <= s.endValue)
)
SELECT ID, SUM(CASE WHEN (Increase >= 0) AND (Rn1 = Rn2) THEN Increase ELSE 0 END) AS [Count]
FROM PreparationCTE
GROUP BY ID
ORDER BY ID
Выход:
----------
ID Count
----------
1001 0
1002 3
1003 1
1004 2
1005 2
1006 3