Sql server SQL Server SUM(如果在多个条件下使用窗口函数)

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”时,我的当前代码

编辑:原始问题名称“SQL Server总和记录仅按特定值分组”。精致,既然现在知道要找什么了

我目前正在尝试使用
OVER
PARITION BY
基于条件进行聚合,但是我不知道如何集成最后一个条件

它应该做什么: 如果按
压缩
有效从
有效到
列中有一个值“H104”
RENTALCOSTTYPEID
然后聚合所有具有以“H”开头的
RENTALCOSTTYPEID
值的
AMOUNT
。否则显示
金额
,不进行汇总

当per
construcd
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
行的rentalcosttypeid
H%
行的总和,则可以稍后与这些结果合并

样本数据

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?