2

私は、患者の請求データをデータセットにプルする SQL ストアド プロシージャに取り組んでいます (その後、VB.net アプリケーションに返されます)。

私の問題: 1 人の患者が 1 つの請求期間/アイテムに対してテーブルに複数の行を持っている場合がありますが、行のフィールドのうち 3 つだけが異なります。毎回各行全体をプルしたくありません。最初はすべてのフィールドが必要で、次回は別のフィールドだけが必要です。すべてのレコードを 1 行にまとめたいと思います。

この 1 つの請求期間/アイテムに対して、この患者がテーブルに何行あるのかを事前に知る方法はありませんが、最大は 10 です。

各請求期間/アイテムに固有の患者であるテーブルに claim_id フィールドがあるため、繰り返すことができます (そして、レコードをプルするために使用しているものです)。テーブルには ID 列である ID フィールドもあるため、すべてのレコードで一意です。

私の現在のストアドプロシージャ:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [BillClm] 
@ClaimId varchar(20),
@AccountCode integer

AS

SET NOCOUNT ON;

declare @PatientGridTable table
(
    Claim_Submitters_Id varchar(20),
    Claim_Status_Code varchar(2),
    Total_Amount_of_Claim decimal(18,2),
    Claim_Payment_Amt decimal(18,2),
    Claim_Patient_Resp decimal(18,2),
    Claim_Filing_Ind_Code varchar(2),
    Payor_Claim_Control_Num varchar(30),
    Bill_Type integer,
    Claim_Adjustment_Group_Reason_Code varchar(10),
    Claim_Adjustment_Amount decimal(18,2),
    Claim_Adjustment_Quantity integer,  
    Patient_Name varchar(60),
    Patient_ID_Num varchar(50),
    Insured_Name varchar(60),
    Insured_ID_Num varchar(50),
    Other_Payor_Name varchar(60),
    Other_Payor_ID varchar(80),
    Other_Subscriber_Name varchar(60),
    Other_Subscriber_ID varchar(80),
    Covered_Quantity integer,
    Covered_Amount decimal(18,2),
    Reimbursement_Rate decimal(6,2),
    Remark_Code varchar(2500),  
    Statement_Period_Start_End varchar(25)
)

insert into @PatientGridTable
(
    Claim_Submitters_Id,
    Claim_Status_Code,
    Total_Amount_of_Claim,
    Claim_Payment_Amt,
    Claim_Patient_Resp,
    Claim_Filing_Ind_Code,
    Payor_Claim_Control_Num,
    Bill_Type,
    Claim_Adjustment_Group_Reason_Code,
    Claim_Adjustment_Amount,
    Claim_Adjustment_Quantity,  
    Patient_Name,
    Patient_ID_Num,
    Insured_Name,
    Insured_ID_Num,
    Other_Payor_Name,
    Other_Payor_ID,
    Other_Subscriber_Name,
    Other_Subscriber_ID,
    Covered_Quantity,
    Covered_Amount,
    Reimbursement_Rate,
    Remark_Code,    
    Statement_Period_Start_End
)
select  
    d.submitter_id, d.claim_status, d.claim_amt, d.payment_amt,
    d.patient_resp, d.claim_ind, d.ref_num, d.bill_type,
    (a.adj_group_code+' '+a.adj_reason_code), a.adj_amount,
    a.adj_qty, d.patient_name, d.patient_id, d.insured_name,
    d.insured_id, d.other_payor, d.other_payor_id, d.other_subscriber,
    d.other_subscriber_id, d.days, d.amount, d.percent,
    (d.adj_ref+'_'+c.code_text),
    (CONVERT(varchar(12), d.claim_start_date, 101)+' '+CONVERT(varchar(12),         d.claim_end_date,101))
    FROM clm_detail_patient d  WITH(NOLOCK)
    INNER JOIN code_list c  WITH(NOLOCK) 
    ON d.adj_ref = c.map_id
    INNER JOIN clm_adj a  WITH(NOLOCK)
    ON d.claim_id = a.claim_id    
    WHERE d.claim_id = @ClaimId     

-- -----------------------------------------------------------------------
select * from @PatientGridTable

clm_adj は、0 ~ 10 行を返す可能性のあるテーブルであり、claim_id フィールドを介して clm_detail_patient テーブルに関連付けられています。(clm_detail_patient には常に 1 行しかありません。)

行ごとに異なる clm_adj テーブルの 3 つのフィールドは、Claim_Adjustment_Group_Reason_Code、Claim_Adjustment_Amount、Claim_Adjustment_Quantity です。

私が望むのは、これら 3 つのフィールドが clm_adj の異なる行ごとに 1 行に並んで表示されることです。それを達成する方法がわかりません。

ここに行くより良い方法があれば、一時テーブルを作成することに縛られていません。どんな助けでも大歓迎です!

サンプル clm_detail_patient テーブル データ:

id     code      amt        payment    pat_resp   clm_ind    ref_num          bill     pat_name          pat_id      days    amount      pct   adj_ref  start_dt      end_date       claim_id
12345    19    15344.43    14962.12    2456.50    MA        20122580231ABC    213    DOE, JANE           123456789B    0    17418.62    0.00    MA01    2012-10-01    2012-10-31    1234-A00000000000001
12346    19    9157.21     8128.58     289.00     MA        20122580231ABC    212    SMITH, JOHN         987654321B    0    8417.58     0.00    MA01    2012-10-10    2012-10-31    4567-A00000000000001
12347    1     2522.99     1143.66     0.00       MA        20122580231ABC    211    JONES, MARY         987123456B    0    1143.66     0.00    MA01    2012-10-14    2012-10-17    9876-A00000000000001

サンプル clm_adj テーブル データ:

adj  reason   amt      qty   claim_id
CO    45    -2074.19    0    1234-A00000000000001
PR    2     2456.50     0    1234-A00000000000001
CO    45    739.63      0    4567-A00000000000001
PR    2     289.00      0    4567-A00000000000001
CO    45    1379.33     0    9876-A00000000000001

各テーブルの最後のフィールドは claim_id です。

したがって、最初の 2 人の患者は clm_adj テーブルに 2 つのレコードを持ち、3 番目の患者は 1 つしか持ちません。

患者 1 に対して現在のストアド プロシージャを実行すると、2 つの行が返されます。初めての患者様にお願いしたいこと

12345    19    15344.43    14962.12    2456.50    MA        20122580231ABC    213    CO 45    -2074.19    0    PR 2    2456.50    0    DOE, JANE           123456789B    0    17418.62    0.00    MA01    2012-10-01  2012-10-31    1234-A00000000000001

したがって、2 つの調整/理由、金額、および数量フィールド レコードが 1 つの行に表示され、隣り合っています (ここでは 9 番目のフィールドの CO 45 から始まります)。

4

1 に答える 1

1

Esoteric Sc​​reen Name が提供するリンクをたどると、問題を解決できました。患者グリッド テーブルを宣言する前に、ストアド プロシージャに以下を挿入しました。

DECLARE @combinedClaimString VARCHAR(MAX)
SELECT @combinedClaimString = COALESCE(@combinedClaimString + '; ', '') + adj_group_code + ', ' + adj_reason_code + ', ' + (SELECT CONVERT(varchar(22), adj_amount)) + ', ' + (SELECT CONVERT(varchar(22), adj_qty))
FROM (SELECT  adj_group_code, adj_reason_code, adj_amount, adj_qty, claim_id 
FROM br549.clm_adj
WHERE claim_id = @ClaimId)
AS temp

これにより、クレームの各部分がコンマで区切られ、個々のクレームがセミコロンで区切られた 1 つの文字列になります。

次に、PatientGridTable 構造を変更して、すべての請求情報に対して 1 つのフィールドのみを含めました。

declare @PatientGridTable table
(
    Claim_Submitters_Id varchar(20),
    Claim_Status_Code varchar(2),
    Total_Amount_of_Claim decimal(18,2),
    Claim_Payment_Amt decimal(18,2),
    Claim_Patient_Resp decimal(18,2),
    Claim_Filing_Ind_Code varchar(2),
    Payor_Claim_Control_Num varchar(30),
    Bill_Type integer,
    Claim_Adjustment varchar(MAX),  
    Patient_Name varchar(60),
    Patient_ID_Num varchar(50),
    Insured_Name varchar(60),
    Insured_ID_Num varchar(50),
    Other_Payor_Name varchar(60),
    Other_Payor_ID varchar(80),
    Other_Subscriber_Name varchar(60),
    Other_Subscriber_ID varchar(80),
    Covered_Quantity integer,
    Covered_Amount decimal(18,2),
    Reimbursement_Rate decimal(6,2),
    Remark_Code varchar(2500),  
    Statement_Period_Start_End varchar(25)
)

次に @combinedClaimString 変数を選択して、PatientGridTable に追加しました。

insert into @PatientGridTable
(
    Claim_Submitters_Id,
    Claim_Status_Code,
    Total_Amount_of_Claim,
    Claim_Payment_Amt,
    Claim_Patient_Resp,
    Claim_Filing_Ind_Code,
    Payor_Claim_Control_Num,
    Bill_Type,
    Claim_Adjustment,  
    Patient_Name,
    Patient_ID_Num,
    Insured_Name,
    Insured_ID_Num,
    Other_Payor_Name,
    Other_Payor_ID,
    Other_Subscriber_Name,
    Other_Subscriber_ID,
    Covered_Quantity,
    Covered_Amount,
    Reimbursement_Rate,
    Remark_Code,    
    Statement_Period_Start_End
)
select  
    d.submitter_id, d.claim_status, d.claim_amt, d.payment_amt,
    d.patient_resp, d.claim_ind, d.ref_num, d.bill_type,
    (SELECT @combinedClaimString as adj_group_code), d.patient_name, d.patient_id, d.insured_name, d.insured_id, d.other_payor, d.other_payor_id, d.other_subscriber,
    d.other_subscriber_id, d.days, d.amount, d.percent,
    (d.adj_ref+'_'+c.code_text),
    (CONVERT(varchar(12), d.claim_start_date, 101)+' '+CONVERT(varchar(12),         d.claim_end_date,101))
    FROM clm_detail_patient d  WITH(NOLOCK)
    INNER JOIN code_list c  WITH(NOLOCK) 
    ON d.adj_ref = c.map_id
    INNER JOIN clm_adj a  WITH(NOLOCK)
    ON d.claim_id = a.claim_id    
    WHERE d.claim_id = @ClaimId

データセットは、患者ごとに 1 行だけでアプリケーションに返されます。次に、クレーム文字列を分割して適切な形式にします。

難解なスクリーンネームに感謝します!

于 2013-03-09T20:54:20.300 に答える