нужна помощь sql запрос к серверу - PullRequest
0 голосов
/ 13 июля 2020

В случае наличия даты или действительной даты: текст вычисляет период между двумя датами в месяц и дни и умножает его на сумму компенсации в количестве лиц, которые получают от нее выгоду

Пример: количество человек 2, сумма компенсации 4000 DZD, период с 01.04.2020 по 18.02.2020 (1 месяц и 14 дней)

(((4000 DZD * 14 days) / 30) + (4000 DZD * 1 month)) * 2 Number of people = 11733.33 DZD

проблема в запросе

Если файл имеет одну компенсацию, он будет рассчитан, и если файл имеет набор компенсаций, отобразится ошибка

Msg 512, уровень 16, состояние 1, строка 4 Подзапрос вернул более одного значения. Это не разрешено, если подзапрос следует за = ,! =, <, <=,>,> = Или когда подзапрос используется как выражение. Msg 512, уровень 16, состояние 1, строка 14 Подзапрос вернул более одного значения. Это не разрешено, если подзапрос следует за = ,! =, <, <=,>,> = Или когда подзапрос используется как выражение.

вопрос: как я могу показать все компенсации и соответствующие счета для каждого файла отдельно, чтобы если я изменю номер файла, например, «20/0003», я использую этот код для запроса sql:

DECLARE @days int;
DECLARE @month int;
DECLARE @Total dec(18, 2);
IF (SELECT ISDATE(date_debut1)FROM Indemnite WHERE id_aff = '20/0002') = 1
BEGIN
    SELECT @month = DATEDIFF(MONTH, date_debut1, date_fin1)
    FROM indemnite;
    SELECT @days = DATEDIFF(DAY, DATEADD(MONTH, DATEDIFF(MONTH, date_debut1, date_fin1), date_debut1), date_fin1)
    FROM indemnite
    WHERE id_aff = '20/0002';
    IF @days < 0
    BEGIN
        SELECT @month = @month - 1
        FROM indemnite;
        SELECT @days = DATEDIFF(DAY, DATEADD(MONTH, @month, date_debut1), date_fin1)
        FROM indemnite
        WHERE id_aff = '20/0002';
    END;
    SELECT @month = @month * 1 % 12;
    SELECT @Total = (((montant_dette1 * @days) / 30) + (montant_dette1 * @month)) * n_personne1
    FROM Indemnite
    WHERE id_aff = '20/0002';
END;
IF (SELECT ISDATE(date_debut1)FROM Indemnite WHERE id_aff = '20/0002') = 0
BEGIN
    SELECT @Total = (montant_dette1 * n_personne1)
    FROM Indemnite
    WHERE id_aff = '20/0002';
END;
SELECT Indemnite1,
       n_personne1,
       date_debut1,
       date_fin1,
       montant_dette1,
       @Total AS Total
FROM Indemnite
WHERE id_aff = '20/0002';

1 Ответ

0 голосов
/ 13 июля 2020

Поиграйте с чем-то вроде этого. На самом деле нет причин разбивать все это на такое количество шагов. Вы можете видеть, что вы можете создавать сложные выражения, так что вам не нужно иметь дело только с одной строкой за раз.

select

    datediff(month, date_debut1, date_fin1) -
        case when datepart(day, date_debut1) > datepart(day, date_fin1) then 1 else 0 end as whole_months,
    datepart(day, dateadd(day, -datepart(day, date_debut1) + 1, date_fin1)) - 1 as whole_days,
            
    montant_dette * n_personel * (
        datediff(month, date_debut1, date_fin1) -
            case when datepart(day, date_debut1) > datepart(day, date_fin1) then 1 else 0 end * montant_dette1 +
        (datepart(day, dateadd(day, -datepart(day, date_debut1) + 1, date_fin1)) - 1) / 30.0
    ) as total,

    montant_dette * n_personel * (
        case when isdate(date_debut1) = 1 then /* really not a great practice */
            datediff(month, date_debut1, date_fin1) -
                case when datepart(day, date_debut1) > datepart(day, date_fin1) then 1 else 0 end * montant_dette1 +
            (datepart(day, dateadd(day, -datepart(day, date_debut1) + 1, date_fin1)) - 1) / 30.0 else 1 end
    ) as total_with_date_check

from Indemnite;

Я удалил весь % 12 бизнес, поскольку я не вижу актуальность ограничения расчета одним годом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...