按同一列分组,但以两种不同方式汇总

时间:2019-08-02 06:17:47

标签: sql aggregate aggregate-functions

我有一个带有schema的表。我想要一个输出表,其中包含每个帐户的所有交易(T)的计数,以及超过特定日期(例如今天30)的那些交易(每个帐户)的计数。
分组列是通用的,即“帐户”,但计数策略不同。使用两个不同的查询并连接结果很容易做到这一点,但是有可能在单个sql查询中做到这一点吗?

输入:

  Account |  T_id |  T_date 
 ---------|-------|--------- 
  A1      |  t1   |     205 
  A1      |  t2   |     420 
  A1      |  t3   |     180 
  A1      |  t5   |     290 
  A2      |  t6   |     100 

预期产量(c = 200):

  Account |  T_count |  T_count_greater_than_c 
 ---------|----------|------------------------- 
  A1      |        3 |                       2 
  A2      |        2 |                       1 

要实现计数,我们可以做到

SELECT Account, COUNT(T_id) 
FROM T 
GROUP BY Account

要实现count>c,我们可以

SELECT Account, COUNT(T_id) 
FROM T 
GROUP BY Account 
HAVING T_date > c

如何在单个查询中合并这两个内容并阻止联接操作?

1 个答案:

答案 0 :(得分:3)

在sum()中使用case或IF语句应用条件聚合:

with mydata as(--Replace this with your table
select stack(6,
             1, '2019-08-01', 100,
             1, '2019-08-01', 100,
             1, '2019-07-01', 200,
             2, '2019-08-01', 100,
             2, '2019-08-01', 100,
             2, '2019-07-01', 200
             ) as (account, transaction_date, amount)
)
select account, sum(amount) amount, 
       sum(case when transaction_date < date_sub(current_date,30) then amount else 0 end) amount_beyond_30
  from mydata
 group by account;

结果:

account   amount  amount_beyond_30
    1       400     200
    2       400     200
    Time taken: 40.716 seconds, Fetched: 2 row(s)

对不起,我的示例是针对Hive SQL的,数据库中的某些功能可能有所不同,但是希望您现在就知道如何在SQL中进行条件聚合。

添加示例和SQ后,

更新 L:

SELECT Account, COUNT(T_id) as cnt,
       count(case when T_date > 200 then 1 else null end) as T_count_greater_than_c
  FROM T 
 GROUP BY Account