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