[英]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.