簡體   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