如何基于超过(分区)另一列创建新列?
How to create new columns based on over(partition by) another column?
我有一个查询给了我这个 table:
| contract | sent_date |
| -------- | --------- |
| a |2020-01-02 |
| a |2020-01-02 |
| b |2020-01-02 |
| a |2020-01-03 |
| c |2020-01-03 |
| b |2020-01-04 |
| a |2020-01-05 |
| a |2020-01-05 |
我想汇总每个发送日期的每份合同的数量。所以 return table 看起来像:
| contract | 2020-01-02 | 2020-01-03 | 2020-01-04 | 2020-01-05 |
| -------- | ---------- | ---------- | ---------- | ---------- |
| a | 2 | 1 | 0 | 2 |
| b | 1 | 0 | 1 | 0 |
| c | 0 | 1 | 0 | 0 |
任何人都可以指导我如何形成这样的查询吗?谢谢。
如果您知道列的日期列表,请使用条件聚合:
select contract,
sum(case when sent_date = '2020-01-02' then 1 else 0 end),
sum(case when sent_date = '2020-01-03' then 1 else 0 end),
sum(case when sent_date = '2020-01-04' then 1 else 0 end),
sum(case when sent_date = '2020-01-05' then 1 else 0 end)
from t
group by contract;
如果列表是基于数据的,那么你需要动态的SQL。确切的语法取决于您使用的数据库。
我有一个查询给了我这个 table:
| contract | sent_date |
| -------- | --------- |
| a |2020-01-02 |
| a |2020-01-02 |
| b |2020-01-02 |
| a |2020-01-03 |
| c |2020-01-03 |
| b |2020-01-04 |
| a |2020-01-05 |
| a |2020-01-05 |
我想汇总每个发送日期的每份合同的数量。所以 return table 看起来像:
| contract | 2020-01-02 | 2020-01-03 | 2020-01-04 | 2020-01-05 |
| -------- | ---------- | ---------- | ---------- | ---------- |
| a | 2 | 1 | 0 | 2 |
| b | 1 | 0 | 1 | 0 |
| c | 0 | 1 | 0 | 0 |
任何人都可以指导我如何形成这样的查询吗?谢谢。
如果您知道列的日期列表,请使用条件聚合:
select contract,
sum(case when sent_date = '2020-01-02' then 1 else 0 end),
sum(case when sent_date = '2020-01-03' then 1 else 0 end),
sum(case when sent_date = '2020-01-04' then 1 else 0 end),
sum(case when sent_date = '2020-01-05' then 1 else 0 end)
from t
group by contract;
如果列表是基于数据的,那么你需要动态的SQL。确切的语法取决于您使用的数据库。