繁体   English   中英

SQL如何按日期和多个条件聚合

[英]SQL how to aggregate by date and multiple criteria

我有这张桌子:

ID 数量 方法 日期
01 10 一个 2022-01-24 12:27:14.440
02 80 一个 2022-01-24 12:27:14.440
01 20 D 2022-02-24 12:27:14.440
01 10 D 2022-02-24 12:27:14.440
02 20 D 2022-02-24 12:27:14.440
03 30 D 2022-02-24 12:27:14.440

我想要这个:

方法 ammount_sum_jan n_transaction_jan n_customer_jan ammount_sum_feb n_transaction_feb n_customer_feb
一个 10 2 2 0 0 0
D 0 0 0 80 4 3

这是一个包含 7 列和行数的表,等于方法的数量。

  • AMMONT:一种方法一个月内的金额总和
  • N_TRANSACTIONS:一种方法一个月内的交易数量
  • N_CUSTOMER:一个月内使用该方法的客户(id)数

我可以通过一个查询得到它吗?

您希望按方法汇总数据,并为 1 月数据和 2 月数据设置单独的列。 您可以通过条件聚合(聚合函数中的CASE表达式)得到它,

select
  method,
  sum(case when month(date) = 1 then ammount else 0 end) as ammount_sum_jan,
  count(case when month(date) = 1 then 1 end) as n_transaction_jan,
  count(distinct case when month(date) = 1 then id end) as n_customer_jan,
  sum(case when month(date) = 2 then ammount else 0 end) as ammount_sum_feb,
  count(case when month(date) = 2 then 1 end) as n_transaction_feb,
  count(distinct case when month(date) = 2 then id end) as n_customer_feb
from mytable
group by method
order by method;

它被称为枢轴,并且对于 dfix 日期看起来像这样。 年份和月份方法的聚合,您可以对您的号码进行计数或求和

select 
  `method`,
  SUM(CASE WHEN EXTRACT( YEAR_MONTH FROM `date` ) = '202201' then `ammount` ELSe 0 END) ammount_sum_jan,
  SUM(CASE WHEN EXTRACT( YEAR_MONTH FROM `date` ) = '202201' then 1 ELSe 0 END) n_transaction_jan,
  COUNT(DISTINCT CASE WHEN EXTRACT( YEAR_MONTH FROM `date` ) = '202201' then `d` ELSe 0 END)    n_customer_jan,
  SUM(CASE WHEN EXTRACT( YEAR_MONTH FROM `date` ) = '202202' then `ammount` ELSe 0 END) ammount_sum_feb,
  SUM(CASE WHEN EXTRACT( YEAR_MONTH FROM `date` ) = '202202' then 1 ELSe 0 END) n_transaction_feb,
  COUNT(DISTINCT CASE WHEN EXTRACT( YEAR_MONTH FROM `date` ) = '202202' then `d` ELSe 0 END)    n_customer_feb
from tab1
GROUP BY `method`

http://www.sqlfiddle.com/#!9/31d8ef/10

更有趣的是让这种动态

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM