Sql Server 聚合或数据透视表查询

Posted

技术标签:

【中文标题】Sql Server 聚合或数据透视表查询【英文标题】:Sql Server Aggregation or Pivot Table Query 【发布时间】:2015-10-14 07:32:25 【问题描述】:

我正在尝试编写一个查询,该查询将告诉我每周进行一定数量交易的客户数量。我不知道从哪里开始查询,但我认为它涉及聚合或数据透视函数。我在 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 |

我希望看到如下回报:

|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 |

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

【问题讨论】:

我认为 OP 希望获得每周客户交易的计数。例如。在第 1 周,2 个客户(即002003)有 0 笔交易,2 个客户(即001004)有 1 笔交易,而零个客户有超过 1 笔交易。 好的。我已经做出了这些改变。希望重开 对于 0 次访问,一周的示例输出似乎缺少值 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;

在查询中,您的表名为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

【讨论】:

以上是关于Sql Server 聚合或数据透视表查询的主要内容,如果未能解决你的问题,请参考以下文章

具有多列聚合的 SQL Server 数据透视表

在数据透视聚合函数中使用CONCAT函数的SQL Server错误

Microsoft Access 数据透视表到 SQL Server 数据透视表

SQL Server 中的数据透视表查询

列子句中带有子查询的 MS SQL Server 数据透视表

SQL Server 2016 中的数据透视表