如何在SQL中将事件计数分配给相对日期值?

时间:2014-09-24 03:37:50

标签: sql excel date datetime data.stackexchange.com

我想排列多个系列,以便将所有里程碑日期设置为零月,这样我就可以测量里程碑的前后效果。我希望能够使用SQL服务器执行此操作。

您可以看到我在this data.stackexchange.com query处开始的近似值。此示例查询返回一个基本上如下所示的表:

+------------+-------------+---------+---------+---------+---------+---------+
|  UserID    |  BadgeDate  | 2014-01 | 2014-02 | 2014-03 | 2014-04 | 2014-05 |
+------------+-------------+---------+---------+---------+---------+---------+
|    7       | 2014-01-02  | 232     | 22      | 19      | 77      | 11      |
+------------+-------------+---------+---------+---------+---------+---------+
|    89      | 2014-04-02  | 345     | 45      | 564     | 13      | 122     |
+------------+-------------+---------+---------+---------+---------+---------+
|    678     | 2014-03-11  | 55      | 14      | 17      | 222     | 109     |
+------------+-------------+---------+---------+---------+---------+---------+
|    897     | 2014-03-07  | 234     | 56      | 201     | 19      | 55      |
+------------+-------------+---------+---------+---------+---------+---------+
|    789     | 2014-02-22  | 331     | 33      | 67      | 108     | 111     |
+------------+-------------+---------+---------+---------+---------+---------+
|    989     | 2014-01-09  | 12      | 89      | 97      | 125     | 323     |
+------------+-------------+---------+---------+---------+---------+---------+

这不是我最终想要的。月份列中的值是每月答案的计数。我想要的是BadgeDate定义的相对月份数下的计数表(BadgeDate月份设置为每个用户的第0个月,前几个月设置为负相对月份#s,以及后几个月设置为正相对月#s)。

这在SQL中可行吗?或者有没有办法在Excel中使用上表进行此操作?

生成此表后,我计划平均相对月总数,以绘制线图,该线图有望在相对月零点处显示明显的拐点。如果没有明显的弯曲,我可以假设里程碑对Y轴度量的影响可以忽略不计。 (我甚至不确定这种图表的名称是什么。我认为如果我知道我正在谈论的内容的适当条款,谷歌可能会更有帮助。)

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这正是聚合函数和 情况下......然后......其他......结束 构造用于:

select
     UserID
    ,BadgeDate
    ,sum(case when AnswerDate = '2014-01' then 1 else 0 end) as '2014-01'
    -- etc.
group by
     userid
    ,BadgeDate

PIVOT 子句也可用于SQL的某些版本和版本,但总体上不太灵活,因此传统机制值得理解。

同样,EXCEL中的PIVOT TABLE构造可以生成相同的报告,但在带宽竞争环境中最大限度地聚合服务器上的数据是有价值的。