SQL Сервер - Как получить значение из другой строки с несколькими критериями? - PullRequest
0 голосов
/ 17 июня 2020

У меня есть образец таблицы 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 будет отображаться в соответствующей строке, где Amount соответствует 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

Вот визуальное изображение, будет ли оно help: visual

Также я начинающий. Спасибо!


Дополнительный комментарий: я попытался ниже FROM / JOIN добавить третий критерий (eDate), и он возвращает три строки, но значения rCode становятся нулевыми.

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

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Я понял, что мне нужно сначала преобразовать дату, чтобы date = date работала.

Первоначально я не был уверен, что date = date в качестве третьего критерия будет работать, поскольку я никогда присоединился к этому намного раньше.

Когда Тони показал мне, что да, это работает, но по какой-то причине это все равно не сработает для меня, я знал, что проблема была в дате. Единственное, что я мог придумать, это форматирование, поэтому я попробовал это, и это сработало.

TempT

CAST(p.eDate AS DATE) AS eDate

Final Select

CONVERT(datetime,t.eDate,101) AS eDate
0 голосов
/ 17 июня 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
...