Sql 服务器聚合或数据透视 Table 查询

Sql Server Aggregation or Pivot Table Query

我正在尝试编写一个查询,该查询将告诉我每周进行一定数量交易的客户数量。我不知道从哪里开始查询,但我假设它涉及聚合或数据透视函数。我在 SqlServer 管理工作室工作。

目前的数据是这样的,其中第一列是客户 ID,随后的每一列都是一周:

|Customer| 1 | 2| 3 |4 |
----------------------
|001     |1 | 0| 2 |2 |
|002     |0 | 2| 1 |0 |
|003     |0 | 4| 1 |1 |
|004     |1 | 0| 0 |1 |

我希望看到 return 如下所示:

|Visits |1 | 2| 3 |4 |
----------------------
|0      |2 | 2| 1 |0 |
|1      |2 | 0| 2 |2 |
|2      |0 | 1| 1 |1 |
|4      |0 | 1| 0 |0 |

我想要的是获取每周的客户交易数。例如。在第一周,2 位客户(即 002003)有 0 笔交易,2 位客户(即 001004)有 1 笔交易,而零位客户有超过1 笔交易

下面的查询将为您提供所需的结果,但请注意,它对列名进行了硬编码。添加更多周列很容易,但如果列数未知,那么您可能需要使用动态 SQL 来研究解决方案(这需要访问信息模式以获取列名称)。不过把它变成一个完全动态的版本并不难。

select 
    Visits
    , coalesce([1],0) as Week1 
    , coalesce([2],0) as Week2 
    , coalesce([3],0) as Week3 
    , coalesce([4],0) as Week4
from (
    select *, count(*) c from (
    select '1' W, week1 Visits from t union all
    select '2' W, week2 Visits from t union all
    select '3' W, week3 Visits from t union all
    select '4' W, week4 Visits from t ) a
group by W, Visits
) x pivot ( max (c) for W in ([1], [2], [3], [4]) ) as pvt;

在查询中你的 table 被调用 t 并且输出是:

Visits  Week1   Week2   Week3   Week4
0       2       2       1       1
1       2       0       2       2
2       0       1       1       1
4       0       1       0       0