T-SQL如何根据字段值是否存在来汇总事务?

问题描述 投票:1回答:1

我正在使用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是可行的方式吗?

谢谢。

sql sql-server group-by common-table-expression
1个回答
1
投票

一个想法是使用自引用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';
© www.soinside.com 2019 - 2024. All rights reserved.