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 个客户(即002
和 003
)有 0 笔交易,2 个客户(即001
和 004
)有 1 笔交易,而零个客户有超过 1 笔交易
【问题讨论】:
我认为 OP 希望获得每周客户交易的计数。例如。在第 1 周,2 个客户(即002
和 003
)有 0 笔交易,2 个客户(即001
和 004
)有 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 聚合或数据透视表查询的主要内容,如果未能解决你的问题,请参考以下文章
在数据透视聚合函数中使用CONCAT函数的SQL Server错误
Microsoft Access 数据透视表到 SQL Server 数据透视表