[英]How to efficiently get a value from the last row in bulk on SQL Server
[英]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.