DECLARE @kontrahent_id INT = 0;
DECLARE @i INT = 0;
DECLARE @count INT = 0;
SET @kontrahent_id = ( SELECT TOP 1
kontrahent_id
FROM
test1);
SET @count = ( SELECT
COUNT(*)
FROM
test1
WHERE
kontrahent_id = @kontrahent_id) * 2;
WHILE @i <= @count
BEGIN
IF( SELECT TOP 1
lp
FROM
test1
WHERE
lp = 1
AND kwota_rabatu = 0
AND cena_obliczona = 0
AND kontrahent_id = @kontrahent_id
ORDER BY
kontrahent_id,
lp,
towar_id) = 1
UPDATE
t1
SET
t1.kwota_rabatu = t1.cena_katalogowa
- ((t1.cena_katalogowa * 100)
- ((t1.cena_katalogowa * (100 + t1.rabat))
- (t1.cena_katalogowa * 100))) / 100,
t1.cena_obliczona = ((t1.cena_katalogowa * 100)
- ((t1.cena_katalogowa * (100 + t1.rabat))
- (t1.cena_katalogowa * 100))) / 100,
t1.kwota_rabatu_sum = t1.cena_katalogowa
- ((t1.cena_katalogowa * 100)
- ((t1.cena_katalogowa * (100 + t1.rabat))
- (t1.cena_katalogowa * 100))) / 100,
t1.cena_obliczona_sum = ((t1.cena_katalogowa * 100)
- ((t1.cena_katalogowa * (100 + t1.rabat))
- (t1.cena_katalogowa * 100))) / 100
FROM
test1 AS t1
JOIN
( SELECT TOP 1
t2.kontrahent_id,
t2.lp,
t2.towar_id
FROM
test1 t2
WHERE
t2.kwota_rabatu = 0
AND t2.cena_obliczona = 0
AND t2.kontrahent_id = @kontrahent_id
ORDER BY
t2.kontrahent_id,
t2.lp) t2
ON t1.kontrahent_id = t2.kontrahent_id
AND t1.lp = t2.lp
AND t1.towar_id = t2.towar_id
WHERE
t1.kontrahent_id = @kontrahent_id;
SET @i = @i + 1;
IF( SELECT TOP 1
lp
FROM
test1
WHERE
kwota_rabatu = 0
AND cena_obliczona = 0
AND kontrahent_id = @kontrahent_id
ORDER BY
kontrahent_id,
lp,
towar_id) > 1
UPDATE
t1
SET
t1.kwota_rabatu = CASE
WHEN t1.cennik_typ = 1
THEN
t1.cena_katalogowa
- ((t1.cena_katalogowa * 100)
- ((t1.cena_katalogowa * (100 + t1.rabat))
- (t1.cena_katalogowa * 100))) / 100
ELSE
CASE
WHEN t1.cennik_typ = 2
THEN
(t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id))
- (((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * 100)
- (((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * (100 + t1.rabat))
- ((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * 100))) / 100
END
END,
t1.kwota_rabatu_sum = CASE
WHEN t1.cennik_typ = 1
THEN
t1.cena_katalogowa
- ((t1.cena_katalogowa * 100)
- ((t1.cena_katalogowa * (100 + t1.rabat))
- (t1.cena_katalogowa * 100))) / 100
+ ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)
ELSE
CASE
WHEN t1.cennik_typ = 2
THEN
((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id))
- (((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * 100)
- (((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id))
* (100 + t1.rabat))
- ((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * 100))) / 100)
+ ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)
END
END,
t1.cena_obliczona = CASE
WHEN t1.cennik_typ = 1
THEN
((t1.cena_katalogowa * 100)
- ((t1.cena_katalogowa * (100 + t1.rabat)) - (t1.cena_katalogowa * 100))) / 100
ELSE
CASE
WHEN t1.cennik_typ = 2
THEN
(((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * 100)
- (((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * (100 + t1.rabat))
- ((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * 100))) / 100
END
END,
t1.cena_obliczona_sum = CASE
WHEN t1.cennik_typ = 1
THEN
t1.cena_katalogowa
- (t1.cena_katalogowa
- ((t1.cena_katalogowa * 100)
- ((t1.cena_katalogowa * (100 + t1.rabat))
- (t1.cena_katalogowa * 100))) / 100
+ ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id))
ELSE
CASE
WHEN t1.cennik_typ = 2
THEN
(((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * 100)
- (((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * (100 + t1.rabat))
- ((t1.cena_katalogowa - ( SELECT
t2.kwota_rabatu_sum
FROM
test1 t2
WHERE
t1.kontrahent_id = t2.kontrahent_id
AND t1.towar_id = t2.towar_id
AND (t1.lp - 1) = t2.lp
AND t2.kontrahent_id = @kontrahent_id)) * 100))) / 100
END
END
FROM
test1 AS t1
JOIN
( SELECT TOP 1
t2.kontrahent_id,
t2.lp,
t2.towar_id
FROM
test1 t2
WHERE
t2.kwota_rabatu = 0
AND t2.cena_obliczona = 0
AND t2.kontrahent_id = @kontrahent_id
ORDER BY
t2.kontrahent_id,
t2.lp) t2
ON t1.kontrahent_id = t2.kontrahent_id
AND t1.lp = t2.lp
AND t1.towar_id = t2.towar_id
WHERE
t1.kontrahent_id = @kontrahent_id;
SET @i = @i + 1;
END;
--obliczenia
SELECT
*
FROM
test1
ORDER BY
kontrahent_id,
towar_id,
lp;
--wynik końcowy
SELECT
a.kontrahent_id,
a.towar_id,
a.cena_katalogowa,
CAST(a.kwota_rabatu_sum AS DECIMAL(10, 2)) AS kwota_rabatu,
CAST(a.cena_obliczona_sum AS DECIMAL(10, 2)) AS cena_obliczona,
CAST(((a.cena_katalogowa - CAST(a.cena_obliczona_sum AS DECIMAL(10, 2))) / a.cena_katalogowa)
* 100 AS DECIMAL(10, 2)) AS rabat_efektywny
FROM
test1 a
JOIN
( SELECT
MAX(b.lp) AS lp,
b.towar_id
FROM
test1 b
GROUP BY
towar_id) AS b
ON a.lp = b.lp
AND a.towar_id = b.towar_id
ORDER BY
a.kontrahent_id,
a.towar_id;
0