我正在使用SQL Server2014。我有一个财务交易列表,如下表所示:
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的VATCode,我需要将其添加到原始TransCode中,然后删除一个VAT。
任何增值税费用都在相关交易的同一天发生。另外,这是每个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是可行的方式吗?
谢谢。
一个想法是使用自引用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';