【问题标题】:Sql Server Aggregation or Pivot Table QuerySql Server 聚合或数据透视表查询
【发布时间】: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?

标签: sql sql-server sql-server-2008 aggregate-functions


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2017-01-21
    相关资源
    最近更新 更多