T- SQL Как мне свести транзакции в зависимости от того, существует ли значение поля? - PullRequest
1 голос
/ 24 января 2020

Я использую SQL Server 2014. У меня есть список финансовых транзакций, как показано в таблице ниже:

PropertyID    OccupancyNumber    TransCode   TransDesc       VATCode    Date        Amount
1234              1111             GRNT      Garage Rent      GVAT      24/01/20    10.00
1234              1111             GVAT      Garage VAT                 24/01/20     2.00
1234              1111             RENT      RENT                       24/01/20    20.00 
1234              1111             AMEN      Amenity Charge   AVAT      23/01/20    100.00
1234              1111             AVAT      Amenity VAT                23/01/20     20.00
4567              2222             GRNT      Garage Rent      GVAT      24/01/20    15.00
4567              2222             GVAT      Garage VAT                 24/01/20     3.00
4567              2222             RENT      RENT                       24/01/20    150.00 
4567              2222             AMEN      Amenity Charge   AVAT      23/01/20    200.00
4567              2222             AVAT      Amenity VAT                23/01/20     40.00

Однако мне нужно свернуть их. Если есть код НДС против TransCode, мне нужно добавить его в исходный код TransCode и удалить НДС.

Все НДС начисляются в тот же день, что и соответствующая транзакция. Кроме того, это согласно OccupancyNumber

Это желаемый результат:

PropertyID    OccupancyNumber    TransCode   TransDesc       VATCode    Date        Amount
1234              1111             GRNT      Garage Rent      GVAT      24/01/20    12.00
1234              1111             RENT      RENT                       24/01/20    20.00 
1234              1111             AMEN      Amenity Charge   AVAT      23/01/20    120.00
4567              2222             GRNT      Garage Rent      GVAT      24/01/20    18.00
4567              2222             RENT      RENT                       24/01/20    150.00 
4567              2222             AMEN      Amenity Charge   AVAT      23/01/20    240.00

Как бы я этого достиг? Является ли CTE путем к go?

Спасибо.

1 Ответ

1 голос
/ 24 января 2020

Одной из идей было бы использование самореференсной JOIN и отфильтровывание транзакций НДС в исходном наборе данных из Вашей таблицы.

Это предполагает пункт ON, но его должно быть достаточно, чтобы получить Вы там, если это не совсем правильно:

WITH YourTable AS(
    SELECT V.PropertyID,
           V.OccupancyNumber,
           V.TransCode,
           V.TransDesc,
           NULLIF(V.VATCode,'') AS VATCode,
           TRY_CONVERT(date,V.[Date],3) AS [Date], --I hope [date] isn't a varchar, considering you display it in the format dd/MM/yy
           V.Amount
    FROM (VALUES(1234,1111,'GRNT','GarageRent','GVAT','24/01/20',10.00),
                (1234,1111,'GVAT','GarageVAT','','24/01/20',2.00),
                (1234,1111,'RENT','RENT','','24/01/20',20.00),
                (1234,1111,'AMEN','AmenityCharge','AVAT','23/01/20',100.00),
                (1234,1111,'AVAT','AmenityVAT','','23/01/20',20.00),
                (4567,2222,'GRNT','GarageRent','GVAT','24/01/20',15.00),
                (4567,2222,'GVAT','GarageVAT','','24/01/20',3.00),
                (4567,2222,'RENT','RENT','','24/01/20',150.00),
                (4567,2222,'AMEN','AmenityCharge','AVAT','23/01/20',200.00),
                (4567,2222,'AVAT','AmenityVAT','','23/01/20',40.00))V(PropertyID,OccupancyNumber,TransCode,TransDesc,VATCode,[Date],Amount))
SELECT YT.PropertyID,
       YT.OccupancyNumber,
       YT.TransCode,
       YT.TransDesc,
       YT.VATCode,
       YT.[Date],
       YT.Amount + ISNULL(VAT.Amount,0) AS Amount
FROM YourTable YT
     LEFT JOIN YourTable VAT ON YT.PropertyID = VAT.PropertyID
                            AND YT.VATCode = VAT.TransCode
WHERE YT.TransCode NOT LIKE '_VAT';
...