1

説明するように努めますが、不明な場合はお知らせください。英語は私の第一言語ではありません。

一連のレコードを挿入するかどうかの条件として機能するクエリについて、助けが必要です。

まず、db テーブル EmployeeProviders を取得しました。

ストアド プロシージャの 1 つで、ある条件に従ってクレジットを再計算します。この場合、レコードは 3 つの量で設定されますが、多かれ少なかれ可能性があります。

再計算後、EmployeeProviders と同じ発効日でまったく同じ数値またはクレジットを取得した場合、これらの値を挿入する必要はありません。EmployeeProviders には、有効日で区切られた各従業員のいくつかのレコード セットが含まれる場合があります。

私にとって難しいのは、レコードを 1 つずつチェックするのではなく、この場合は 3 つのセットでチェックするクエリを作成することです。レコードの 1 つが一致しない場合は、3 つすべてを挿入する必要があります。それらのすべてが同じ場合、レコードを挿入しません。

declare @StartDate datetime, @employee_id int
select @StartDate = '2013-07-01', @employee_id = 3465

たとえば、値が入力された db テーブルを次に示します。

    DECLARE @EmployeeProviders TABLE (
    ident_id int IDENTITY,
                employee_id int,
    id int, 
    plan_id int, 
    credits decimal(18,5),
    effective_date datetime                     
)

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (18753, 23, 0.00000, '2013-06-01')

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (3465, 18753, 15, 0.00000, '2013-06-01')

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (3465, 18753, 16, 60.00, '2013-06-01')

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (3465, 18753, 23, 0.00000, '2013-07-01')

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (3465, 18753, 15, 0.00000, '2013-07-01')

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (3465, 18753, 16, 81.580, '2013-07-01')

SELECT * FROM @EmployeeProviders WHERE plan_id = 18753 and datediff(dd,effective_date,@StartDate) = 0

ストアド プロシージャの一時テーブルを次に示します。計算プロセス中に更新されます

DECLARE @Providers TABLE (
    id int, 
    plan_id int, 
    credits decimal(18,5)                           
)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 23, 0.00000)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 15, 0.00000)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 16, 81.580)

SELECT * FROM @Providers

この一時テーブルのすべての更新量は db テーブルの EmployeeProviders と同じなので、新しいレコード セットを挿入する必要はありませんEmployeeProviders ()... SELECT ... FROM @Providers ,,, -- 値が EmployeeProviders と同じでない場合に 3 つのレコードのセットを返すクエリ

別のシナリオでは、@Providers.credits = 65 です。これは、id = 16 の EmployeeProviders.credits と比較して金額が変更されているためです。新しい 3 つのレコードのセットを EmployeeProvider テーブルに追加します。

    DECLARE @Providers TABLE (
    id int, 
    plan_id int, 
    credits decimal(18,5)                           
)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 23, 0.00000)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 15, 0.00000)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 16, 65.00)

SELECT * FROM @Providers

前もって感謝します、

マック

4

3 に答える 3

1

私があなたの質問を正しく理解していれば、挿入を条件付きにすることで問題を解決できますExcept

if exists(
select ID, plan_id , credits from @Providers
except
SELECT id, plan_id, credits FROM @EmployeeProviders WHERE plan_id = 18753 and   datediff(dd,effective_date,@StartDate) = 0
)
于 2013-07-04T19:04:48.877 に答える
0

次のクエリのようなものを使用します。私はあなたのためにそれを一般化しました。確認してください。

WITH TEMP 
AS
(
SELECT A.employee_id, A.plan_id, A.id, A.credits, A.effective_date,CASE WHEN A.CREDITS = B.CREDITS THEN    1 ELSE 0 END AS SAME
FROM @EmployeeProviders as A INNER JOIN @Providers as B ON A.ID = B.ID AND 
A.PLAN_ID = B.PLAN_ID AND A.effective_date = '2013-07-01'
)

SELECT *
FROM TEMP AS A INNER JOIN 
(SELECT EMPLOYEE_ID , PLAN_ID , SUM(SAME) AS TOTAL , COUNT(*) AS CNT FROM TEMP GROUP BY EMPLOYEE_ID ,   PLAN_ID ) AS B  
ON A.EMPLOYEE_ID = B.EMPLOYEE_ID AND A.PLAN_ID = B.PLAN_ID
WHERE B.TOTAL != B.CNT 
于 2013-07-04T19:41:36.827 に答える
0

刺してみます。ストアド プロシージャでこれを試してください。

if (EXISTS(select 3465,pr.plan_id,pr.id,epr.credits,effective_date from
   providers pr left join @EmployeeProviders epr on
   pr.id = epr.id and pr.plan_id = epr.plan_id and pr.credits = epr.credits and    effective_date = '2013-07-01'
   where epr.credits is NULL ))
 INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
 select 3463,plan_id,id,credits,'2013-07-01' from @Providers

実際に見る

于 2013-07-04T19:02:22.320 に答える