SQL Server SUM IF在多个条件下使用Window函数

问题描述

编辑:原始问题名称sql Server SUM仅记录某些值的分组依据”。精致,因为现在知道要寻找什么。

我目前正尝试根据条件使用OVERPARITION BY进行汇总,但是我不知道如何整合最后一个条件。

它应该做什么: 如果每个CONTRACTIDVALIDFROMVALIDTO的列RENTALCOSTTYPEID中有一个值'H104' 然后,汇总所有以{H}开头的AMOUNT值的RENTALCOSTTYPEID。 ELSE显示AMOUNT,但不进行汇总。

当每个CONTRACTIDVALIDFROMVALIDTO一个值'H104'时,我当前的代码有效。但是,如果每个CONTRACTIDVALIDFROMVALIDTO都没有值'H104',它将给出'0'而不是AMOUNT 查看代码时,显然将其置为“ 0”,但是如果我更改此值,它将与值为“ H104”的字段混淆。如何在以下代码中整合这种情况?

SELECT
CONTRACTID,RENTALCOSTTYPEID,VALIDFROM,VALIDTO,AMOUNT,CASE 
    WHEN RENTALCOSTTYPEID = 'H104' 
    THEN SUM(CASE WHEN RENTALCOSTTYPEID LIKE 'H%' THEN AMOUNT ELSE 0  END) OVER (PARTITION BY CONTRACTID,VALIDTO) 
    ELSE SUM(CASE WHEN RENTALCOSTTYPEID LIKE 'H%' THEN 0 ELSE AMOUNT  END) OVER (PARTITION BY RENTALCOSTTYPEID,CONTRACTID,VALIDTO)
END AS TESTCOLUMN
FROM PMCCONTRACTLINE

CURRENT列包含我当前的结果

ENDRESULT列包含我想要的结果

+------------+------------------+------------+------------+---------+---------+-----------+
| CONTRACTID | RENTALCOSTTYPEID | VALIDFROM  | VALIDTO    | AMOUNT  | CURRENT | ENDRESULT |
+------------+------------------+------------+------------+---------+---------+-----------+
| HC018453   | H104             | 2020-07-01 | 2021-01-01 | 775.08  | 446.72  | 446.72    |
+------------+------------------+------------+------------+---------+---------+-----------+
| HC018453   | H110             | 2020-07-01 | 2021-01-01 | -328.36 | 0.00    | 0.00      |
+------------+------------------+------------+------------+---------+---------+-----------+
| HC018453   | V446             | 2020-07-01 | 2021-01-01 | 48.00   | 48.00   | 48.00     |
+------------+------------------+------------+------------+---------+---------+-----------+
| HC055533   | H105             | 2020-07-01 | 2021-01-01 | 330.00  | 0.00    | 330.00    |
+------------+------------------+------------+------------+---------+---------+-----------+
| HC055533   | H105H            | 2019-07-01 | 2020-06-30 | 330.00  | 0.00    | 330.00    |
+------------+------------------+------------+------------+---------+---------+-----------+
| HC103696   | H104             | 2020-06-03 | 2021-01-01 | 867.00  | 867.00  | 867.00    |
+------------+------------------+------------+------------+---------+---------+-----------+
| HC103696   | S468             | 2020-06-03 | 2021-01-01 | 2.00    | 2.00    | 2.00      |
+------------+------------------+------------+------------+---------+---------+-----------+
| HC103696   | S484             | 2020-06-03 | 2021-01-01 | 1.00    | 1.00    | 1.00      |
+------------+------------------+------------+------------+---------+---------+-----------+
| HC103696   | S488             | 2020-06-03 | 2021-01-01 | 0.50    | 0.50    | 0.50      |
+------------+------------------+------------+------------+---------+---------+-----------+

解决方法

您正在尝试在同一行上显示汇总值和非汇总值。虽然可以在单个select语句中实现这一点,但在一个查询中合并几个select会更容易。

例如,如果您计算common table expression(CTE)中其中有H%行的rentalcosttypeid H104行的总和,那么以后可以将这些结果相加上。

样本数据

declare @PMCCONTRACTLINE table
(
    CONTRACTID nvarchar(10),RENTALCOSTTYPEID nvarchar(5),VALIDFROM date,VALIDTO date,AMOUNT money
);

insert into @PMCCONTRACTLINE (CONTRACTID,RENTALCOSTTYPEID,VALIDFROM,VALIDTO,AMOUNT) values
('HC018453','H104','2020-07-01','2021-01-01',775.08 ),('HC018453','H110',-328.36),'V446',48.00  ),('HC055533','H105',330.00 ),'H105H','2019-07-01','2020-06-30',('HC103696','2020-06-03',867.00 ),'S468',2.00   ),'S484',1.00   ),'S488',0.50   );

解决方案

cte_SumH104定义为H%行的结果集,其中H104行是同一ContractID。

with cte_SumH104 as
(
    select cl.CONTRACTID,sum(cl.AMOUNT) as 'SUMH'
    from @PMCCONTRACTLINE cl
    where cl.RENTALCOSTTYPEID like 'H%'
      and exists (  select top 1 'x'
                    from @PMCCONTRACTLINE clh104
                    where clh104.CONTRACTID = cl.CONTRACTID
                      and clh104.RENTALCOSTTYPEID = 'H104' )
    group by cl.CONTRACTID
)
select  cl.*,s.SUMH,case
            when cl.RENTALCOSTTYPEID = 'H104' then s.SUMH
            when cl.RENTALCOSTTYPEID like 'H%' and s.SUMH is not null then 0
            else cl.AMOUNT
        end as 'TEST'
from @PMCCONTRACTLINE cl
left join cte_SumH104 s
    on s.CONTRACTID = cl.CONTRACTID;

结果

CONTRACTID  RENTALCOSTTYPEID  VALIDFROM   VALIDTO     AMOUNT    SUMH     TEST
----------- ----------------- ----------- ----------- --------- -------- --------
HC018453    H104              2020-07-01  2021-01-01  775,08    446,72   446,72
HC018453    H110              2020-07-01  2021-01-01  -328,36   446,72   0,00
HC018453    V446              2020-07-01  2021-01-01  48,00     446,72   48,00
HC055533    H105              2020-07-01  2021-01-01  330,00    NULL     330,00
HC055533    H105H             2019-07-01  2020-06-30  330,00
HC103696    H104              2020-06-03  2021-01-01  867,00    867,00   867,00
HC103696    S468              2020-06-03  2021-01-01  2,00      867,00   2,00
HC103696    S484              2020-06-03  2021-01-01  1,00   1,00
HC103696    S488              2020-06-03  2021-01-01  0,50      867,00   0,50