问题描述
编辑:原始问题名称“ sql Server SUM仅记录某些值的分组依据”。精致,因为现在知道要寻找什么。
我目前正尝试根据条件使用OVER
和PARITION BY
进行汇总,但是我不知道如何整合最后一个条件。
它应该做什么:
如果每个CONTRACTID
,VALIDFROM
,VALIDTO
的列RENTALCOSTTYPEID
中有一个值'H104'
然后,汇总所有以{H}开头的AMOUNT
值的RENTALCOSTTYPEID
。 ELSE显示AMOUNT
,但不进行汇总。
当每个CONTRACTID
,VALIDFROM
,VALIDTO
有一个值'H104'时,我当前的代码有效。但是,如果每个CONTRACTID
,VALIDFROM
,VALIDTO
都没有值'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