Sql server SQL Server SUM(如果在多个条件下使用窗口函数)
编辑:原始问题名称“SQL Server总和记录仅按特定值分组”。精致,既然现在知道要找什么了 我目前正在尝试使用Sql server SQL Server SUM(如果在多个条件下使用窗口函数),sql-server,sql-server-2012,Sql Server,Sql Server 2012,编辑:原始问题名称“SQL Server总和记录仅按特定值分组”。精致,既然现在知道要找什么了 我目前正在尝试使用OVER和PARITION BY基于条件进行聚合,但是我不知道如何集成最后一个条件 它应该做什么: 如果按压缩,有效从,有效到列中有一个值“H104”RENTALCOSTTYPEID 然后聚合所有具有以“H”开头的RENTALCOSTTYPEID值的AMOUNT。否则显示金额,不进行汇总 当perconstrucd,VALIDFROM,VALIDTO存在值“H104”时,我的当前代码
OVER
和PARITION BY
基于条件进行聚合,但是我不知道如何集成最后一个条件
它应该做什么:
如果按压缩
,有效从
,有效到
列中有一个值“H104”RENTALCOSTTYPEID
然后聚合所有具有以“H”开头的RENTALCOSTTYPEID
值的AMOUNT
。否则显示金额
,不进行汇总
当perconstrucd
,VALIDFROM
,VALIDTO
存在值“H104”时,我的当前代码工作。但是,如果按压缩
,有效从
,有效到
,则不存在值“H104”,它给出的是“0”,而不是金额
查看代码,它显然会放入“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, VALIDFROM, VALIDTO)
ELSE SUM(CASE WHEN RENTALCOSTTYPEID LIKE 'H%' THEN 0 ELSE AMOUNT END) OVER (PARTITION BY RENTALCOSTTYPEID, CONTRACTID, VALIDFROM, 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
更容易
例如,如果计算a(CTE)中包含H104
行的rentalcosttypeidH%
行的总和,则可以稍后与这些结果合并
样本数据
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', '2020-07-01', '2021-01-01', -328.36),
('HC018453', 'V446', '2020-07-01', '2021-01-01', 48.00 ),
('HC055533', 'H105', '2020-07-01', '2021-01-01', 330.00 ),
('HC055533', 'H105H', '2019-07-01', '2020-06-30', 330.00 ),
('HC103696', 'H104', '2020-06-03', '2021-01-01', 867.00 ),
('HC103696', 'S468', '2020-06-03', '2021-01-01', 2.00 ),
('HC103696', 'S484', '2020-06-03', '2021-01-01', 1.00 ),
('HC103696', 'S488', '2020-06-03', '2021-01-01', 0.50 );
解决方案
将cte\u SumH104
定义为H%
行的结果集,其中包含一个H104
行,用于相同的压缩
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 NULL 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 867,00 1,00
HC103696 S488 2020-06-03 2021-01-01 0,50 867,00 0,50
您可以尝试将查询用作子查询,并在costtype=N'H107'时添加一列,如
CASE,然后将amount ELSE 0结束为amountH107
,然后创建一个查询和SUM
此新列……您可以在聚合函数中添加CASE
表达式。看这个,我就快到了。编辑我的帖子(见下文)。下面的代码几乎完成了我需要的所有操作:CASE WHEN C.RENTALCOSTTYPEID='H104'然后SUM(CASE WHEN C.RENTALCOSTTYPEID像'H%'然后C.AMOUNT ELSE 0 END)OVER(按C.construcd、C.VALIDFROM、C.VALIDTO分区)OVER SUM(CASE WHEN C.RENTALCOSTTYPEID像'H%'然后0 ELSE C.AMOUNT END)OVER(按C.RENTALCOSTTYPEID、C.CONTRACTID、C.VALIDFROM、C.VALIDTO划分)以TestColumn结尾为什么前三行具有不同的ENDRESULT
?它们具有相同的CONTRACTID
、VALIDFROM
和VALIDTO
,并且它们在RENTALCOSTTYPEID
列中具有“H104”不应该都是446.72?