繁体   English   中英

需要帮助 sql 服务器查询

[英]need help sql server query

在日期是否存在或有效日期的情况下:文本计算每个月和天两个日期之间的时间段,并将其乘以从中受益的人数中的补偿金额

示例:人数 2,赔偿金额 4000 DZD,期间为 2020 年 1 月 4 日至 2020 年 2 月 18 日(1 个月零 14 天)

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

查询中的问题

如果文件有一个补偿,则计算,如果文件有一组补偿,则显示错误

消息 512,第 16 层,State 1,第 4 行
子查询返回超过 1 个值。 当子查询跟随 =,, =, <, <=,>.> = 或当子查询用作表达式时,这是不允许的。
消息 512,第 16 级,State 1,第 14 行
子查询返回超过 1 个值。 当子查询跟随 =,, =, <, <=,>.> = 或当子查询用作表达式时,这是不允许的。

问题:如何分别显示每个文件的所有补偿和相应帐户,以便如果我更改文件编号,例如“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';

玩这样的东西。 真的没有理由将所有这些分解成这么多步骤。 您可以看到您可以构建复杂的表达式,这样您就不需要一次只处理一行。

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业务,因为我看不到将计算限制在一年内的相关性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM