如何基于超过(分区)另一列创建新列?

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。确切的语法取决于您使用的数据库。