簡體   English   中英

SQL 服務器 - 如何從具有多個條件的不同行中獲取值?

[英]SQL Server - How to get value from different row with multiple criteria?

我有一個樣本表 TempT:

Amount  | ChargeID  | IDPaymentItem | rCode | rCodeAmt | IDPayment | eDate
0.00    | 530064    | 1236182       | PR1   | 251.10   | 769630    | 04/07/2020
0.00    | 530064    | 1236182       | PR45  | 2238.90  | 769630    | 04/07/2020
188.33  | 530064    | 1240623       | CO45  | 2238.90  | 771802    | 04/30/2020
188.33  | 530064    | 1240623       | PR2   | 62.77    | 771802    | 04/30/2020
2238.90 | 530064    | 1240624       |       | 0.00     | 771803    | 04/30/2020

我想創建另一個表,其中 rCode 將顯示在金額與 rCodeAmt、ChargeID 和 eDate 匹配的相應行上。

這是我到目前為止的代碼,我被卡住了:

DECLARE @From DATETIME
DECLARE @To DATETIME

SET @From = '{Enter starting date range: <!DATE!>}' 
SET @To = '{Enter ending date range: <!DATE!>} 23:59:59' 

SELECT
pi.Amount,
pi.ChargeID,
pi.IDPaymentItem,
pi.PatientID,
SUBSTRING(Value,0,CHARINDEX('=',Value)) AS rCode,
CAST(CAST(SUBSTRING(Value,CHARINDEX('=',Value) + 1,999999) AS FLOAT) AS DECIMAL(30,2)) AS rCodeAmt,
p.IDPayment,
p.eDate,
p.PaymentTypeID,
p.sDate

INTO #TempT

FROM PaymentItem pi
     CROSS APPLY STRING_SPLIT(ReasonCodes,',')
INNER JOIN Payment p on p.IDPayment = pi.PaymentID

WHERE p.eDate BETWEEN @From AND @To

ORDER BY pi.ChargeID

SELECT
pi.Amount,
pi.ChargeID,
pi.IDPaymentItem,
pi.PatientID,
t.rCode,
t.rCodeAmt,
p.IDPayment,
p.eDate,
p.PaymentTypeID,
p.sDate

FROM PaymentItem pi
INNER JOIN Payment p ON p.IDPayment = pi.PaymentID
FULL OUTER JOIN #TempT t ON (t.rCodeAmt = pi.Amount
                             AND t.ChargeID = pi.ChargeID)

WHERE p.eDate BETWEEN @From AND @To

ORDER BY pi.ChargeID,p.IDPayment

DROP TABLE #TempT

這是結果(滿足的條件:rCodeAmt 和 ChargeID)。

Amount  | ChargeID  | IDPaymentItem | rCode | rCodeAmt | IDPayment | eDate
0.00    | 530064    | 1236182       |       |          | 769630    | 04/07/2020
188.33  | 530064    | 1240623       |       |          | 771802    | 04/30/2020
2238.90 | 530064    | 1240624       | CO45  | 2238.90  | 771803    | 04/30/2020
2238.90 | 530064    | 1240624       | PR45  | 2238.90  | 771803    | 04/30/2020

我不知道如何插入第三個標准(eDate)。

我希望結果是:

Amount  | ChargeID  | IDPaymentItem | rCode | rCodeAmt | IDPayment | eDate
0.00    | 530064    | 1236182       |       |          | 769630    | 04/07/2020
188.33  | 530064    | 1240623       |       |          | 771802    | 04/30/2020
2238.90 | 530064    | 1240624       | CO45  | 2238.90  | 771803    | 04/30/2020

如果有幫助,這是一個視覺效果:視覺

我的專長也是初學者。 謝謝!


附加評論:我嘗試在 FROM/JOIN 下面添加第三個條件(eDate),它確實返回三行,但 rCode 值變為 null。

FROM PaymentItem pi
INNER JOIN Payment p ON p.IDPayment = pi.PaymentID
FULL OUTER JOIN #TempT t ON (t.rCodeAmt = pi.Amount
                             AND t.ChargeID = pi.ChargeID
                             AND t.eDate = p.eDate)

樣本:

Amount  | ChargeID  | IDPaymentItem | rCode | rCodeAmt | IDPayment | eDate
0.00    | 530064    | 1236182       | null  | null     | 769630    | 04/07/2020
188.33  | 530064    | 1240623       | null  | null     | 771802    | 04/30/2020
2238.90 | 530064    | 1240624       | null  | null     | 771803    | 04/30/2020

我認為以下內容應該對您有用-但是,您在#tempt 中提供的示例數據與屏幕截圖不匹配/缺少某些列,因此無法使用這些附加列進行測試...但是以下內容有效退回您的要求!

create table #tempt (
    Amount float
    ,ChargeID int
    ,IDPaymentItem int
    ,rCode varchar(10)
    ,rCodeAmt float
    ,IDPayment int
    ,eDate date
);

insert into #tempt select '0','530064','1236182','PR1','251.1','769630','2020-04-07'
insert into #tempt select '0','530064','1236182','PR45','2238.9','769630','2020-04-07'
insert into #tempt select '188.33','530064','1240623','CO45','2238.9','771802','2020-04-30'
insert into #tempt select '188.33','530064','1240623','PR2','62.77','771802','2020-04-30'
insert into #tempt select '2238.9','530064','1240624','','0','771803','2020-04-30'

----------------
--FINAL SELECT--
----------------
select distinct
    t.Amount
    ,t.ChargeID
    ,t.IDPaymentItem
    --,t.PatientID
    ,t1.rCode
    ,t1.rCodeAmt
    ,t.IDPayment
    ,t.eDate
    --,t.PaymentTypeID
    --,t.sDate

from
    #tempt t
    left outer join #tempt t1
        on t.amount = t1.rCodeAmt
        and t.chargeid = t1.chargeid
        and t.edate = t1.edate

我發現我必須先轉換日期才能使 date = date 起作用。

最初我不確定 date = date 作為第三個標准是否會起作用,因為我以前從未加入過那么多。

當托尼告訴我是的,它確實有效,但由於某種原因它仍然對我不起作用,我知道問題出在日期上。 我唯一能想到的就是格式,所以我試過了,它奏效了。

溫度

CAST(p.eDate AS DATE) AS eDate

最終 Select

CONVERT(datetime,t.eDate,101) AS eDate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM