2014-09-24 84 views
2

我想要排列多个系列,以便所有里程碑日期都设置为零个月,这样我就可以测量里程碑的前后效应。我希望能够使用SQL服务器来做到这一点。如何将事件计数分配给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轴度量的影响可以忽略不计。 (我甚至不太确定这种图表的名称,如果我知道我正在讨论的内容的适当条款,Google可能会更有帮助。)

任何想法?

回答

2

这也恰恰是聚合函数和情况下... THEN ... ELSE ... END结构是:

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构造可以生成相同的报告,但是在带宽竞争环境中最大限度地聚合服务器上的数据是有价值的。

+0

对不起,我可能不清楚。上面提供的表格是我已经拥有的,而不是我希望返回的。我编辑了这个问题来强调这个事实。 – samthebrand 2014-09-24 04:20:30

+1

@SamtheBrand:好的。您可以UNPIVOT,按月执行日期差异,然后在连续的子查询中再次跳出。 Aaron Bertrand在此处有一个脚本(http://www.mssqltips.com/sqlservertip/2783/script-to-create-dynamic-pivot-queries-in-sql-server/)用于动态数据透视查询生成。 Itzik Ben-Gan使用CROSS APPLY发布了一个优雅的UNPIVOT,但我现在还不能找到参考。 – 2014-09-24 04:31:04

+0

@SamtheBrand:Itzik的CROSS APPLY UNPIVOT的源代码可以在这里找到:http://www.sql.co.il/books/source_code/Advanced%20T-SQL.txt。搜索字符串' - *** Unpivoting'来查找示例SQL。 – 2014-09-24 04:36:59

相关问题