在同一查询中进行不同的求和

wgx48brx  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(278)

我目前在一个查询上遇到了一个问题:我有两个表。
表1:

表2:

我尝试在datehour(有效)和每个活动、每个prf\U id、每个长度和每个类型上联接这两个表,以计算表2的hpp列每年的发生次数。
例如,对于给定的prf\ U id、长度、类型和活动,我将在表1中列出2019年4月1日到2020年4月1日之间的日期范围。在这种情况下,在我的查询中,我需要一个新的列,为2019年4月1日至2019年12月31日之间的所有日期提供这段时间内水电站发生率的总和。对于2020年,总额将在2020年1月1日至2020年4月1日之间。
我试过这样做:

SELECT Table1.DateHour,
SUM(Table2.HPP) OVER (PARTITION BY YEAR(Table2.DateHour)
FROM Table1
LEFT JOIN Table2 on Table2.DateHour=Table1.DateHour

但这给了我非常奇怪的结果 OVER PARTITION BY 似乎不起作用。

yfjy0ee7

yfjy0ee71#

你的问题混淆了术语。

计数与总和

... 计算发生次数。。。总数是。。。
计数事件与将它们相加是不同的。每个可以合并的记录都算作一次发生。计算总和意味着将一列的值相加。我将这两种计算都添加到下面的解决方案中(参见 IsHour_SumTable2_Count ).

组合分组

在同一个查询中进行不同的求和[问题标题]
... 对于每个战役,每个prf\U id,每个长度和每个类型。。。
您是要在这些列的每个组合上进行聚合,还是单独在每个列上进行聚合?我假设你是在追求我的解决方案中的组合。举例说明:
如果
A 有3个可能的值( A1, A2, A3 )以及
B 有2个可能的值( B1, B2 )
然后
有5个计数( 3 + 2 )聚合时( A )以及( B )独立地
有6个计数( 3 * 2 )当聚合( A,B )
再一次:

A1 -> count 1     vs     A1,B1 -> count 1
A2 -> count 2            A1,B2 -> count 2
A3 -> count 3            A2,B1 -> count 3
B1 -> count 4            A2,B2 -> count 4
B2 -> count 5            A3,B1 -> count 5
                         A3,B2 -> count 6

样本数据

我漏掉了那个专栏 Valuetable1 因为这不是你问题的一部分。我还更改了 table22018-05-23 与大多数 table1 记录。否则所有的计数和总数都会 0 .

declare @table1 table
(
    DateHour datetime,
    PRF_ID int,
    Campaign nvarchar(5),
    Length int,
    ContractType nvarchar(5)
);

insert into @table1 (DateHour, PRF_ID, Campaign, Length, ContractType) values
('2018-05-23 00:00', 1, 'Q218', 1, 'G'),
('2018-05-23 01:00', 1, 'Q218', 1, 'G'),
('2018-05-23 02:00', 1, 'Q218', 1, 'G'),
('2020-05-23 03:00', 1, 'Q120', 1, 'G'),
('2018-05-23 04:00', 1, 'Q218', 1, 'G'),
('2019-07-23 01:00', 1, 'Q219', 1, 'G');

declare @table2 table
(
    DateHour datetime,
    HPP int
);

insert into @table2 (DateHour, HPP) values
('2018-05-23 00:00', 0),
('2018-05-23 01:00', 0),
('2018-05-23 02:00', 1),
('2018-05-23 03:00', 0),
('2018-05-23 04:00', 1),
('2018-05-23 05:00', 0),
('2018-05-23 06:00', 0),
('2018-05-23 07:00', 0);

解决方案

对日期年份进行聚合的最简单方法是将该部分拆分为一个新列,而不是使用 over(partition by ...) 建筑。如果不需要新列 Year 在输出中,只需将其从字段列表中删除(在 select ),但它必须保留在grouping子句中(在 group by ).

select  year(t1.DateHour) as 'Year',
        t1.PRF_ID,
        t1.Campaign,
        t1.Length,
        t1.ContractType,
        isnull(sum(t2.HPP), 0) as 'IsHour_Sum',
        count(t2.DateHour) as 'Table2_Count'
from @table1 t1
left join @table2 t2
    on t2.DateHour = t1.DateHour
/* -- specify date filter as required
where t1.DateHour >= '2019-04-01 00:00'
  and t1.DateHour <  '2020-04-01 00:00'

* /

group by    year(t1.DateHour),
            t1.PRF_ID,
            t1.Campaign,
            t1.Length,
            t1.ContractType;

结果

Year        PRF_ID      Campaign Length      ContractType IsHour_Sum  Table2_Count
----------- ----------- -------- ----------- ------------ ----------- ------------
2018        1           Q218     1           G            2           4
2019        1           Q219     1           G            0           0
2020        1           Q120     1           G            0           0

相关问题