重新配置表的最佳方法是使它可以同时按2列分组?

时间:2015-06-08 13:36:45

标签: sql sql-server excel sql-server-2008-r2

编辑:感谢迄今为止的所有回复,对不起我的原始问题是如此混乱。我试着在这里澄清......

史蒂夫,对不起,我没有表格的创建信息。但是,它看起来像这样......

Activity_SerialNum - Student_ID - outdoors_date - indoors_date - video_game_date
000000001            222222222     6/5/15 16:30    
000000002            333333333                      6/5/15 15:00 
000000003            444444444     6/5/15 12:30
000000004            222222222                                      6/5/15 11:00          
000000005            333333333     6/5/15 9:00
000000006            222222222                      6/4/15 15:30
000000007            333333333                      6/4/15 12:00
000000008            444444444     6/4/15 16:00
000000009            222222222     6/4/16 9:00                                         
000000010            333333333                                      6/4/15 16:00

在任何特定日期,您可以让多个ID执行多项活动,每次有人进行任何类型的活动时,他们会在表格中创建一个新的序列号,该序列号链接了一个学生ID和至少一个特定活动开始日期(虽然可以想象可能存在活动序列号行在两个甚至所有3个活动日期列中具有学生ID和活动日期的情况,例如它们在同一天的室内和室外)。在一天结束时,我不需要活动序列号....所有我需要的是一种方法来将特定的学生ID(经常重新出现)与他们参与的次数相关联。每个活动,并能够在一个月内将其分解,以了解活动参与如何改变个人或整个群体。即"学生333333333在2014年1月记录了17个indoor_dates和14个video_game_dates的活动,但是在2014年2月他记录了20个在室内日期和10个video_game_dates"而且" 2014年11月,共有240000次户外活动(outdoors_dates),400000次室内活动(室内日期和350000次视频游戏活动(video_game_dates)。我对此不感兴趣特定的日期或时间,或持续时间(因为我只有活动的开始时间,我无论如何都无法衡量),只是计算每个student_id的次数(然后是学生的总数) )按月参加每项活动。

感谢丹的书和方法建议,我会调查一下。 Anon,我同意所有的意思...虽然我尽快教自己,但我很谦卑,有点不安,因为我现在还不知道多少,所以希望能赢得& #39; t永远。 (虽然FWIW我只是列出了桌子和行的大小,所以没有人会认为我可以把它直接放到excel中来弄乱它,因为我很确定它太大了Excel文件)。

原帖: 我想要做的是计算每个人在每个月参加3项活动中的一项活动的次数。我需要创建一个最方便的表(然后将该表发送到excel,以便我可以创建一个数据透视表+图表,使人们可以按月查看整体活动参与趋势,然后查看活动参与趋势每个人如果他们这样选择......但理想情况下我希望让SQL尽可能多地进行繁重的工作。

我在sql server 2008 r2工作,让我们说我跟踪学生的活动,看看他们在做什么。我的表包含一个varchar(16)主键,它基本上是在任何学生表示他们参加某项活动时生成的(这些实例有数百万)。另一个varchar(255)行包含数十万个9位数的学生ID(这些是每个学生都有的,但是在整个专栏中都会被复制,因为每个学生在任何一个月的过程中都参加了多项活动......我没有&# 39;将它们设置为255,这发生在我的时间之前)。然后是3个日期时间行,每个活动一个(户外,室内,video_games),包含他们当天参加的活动的开始时间。

由于我在这里学习曲线的珠穆朗玛峰部分,我有点挣扎。我的第一组代码并没有完成任何事情,真的......在计数中只有大量重复,而且如果需要的话,能够在每个月看到每个student_id正在做什么的方面远远不能满足我的要求。 (我删除了原始的垃圾代码,因为我觉得它太糟糕了,只是更令人困惑)

所以我的问题是,我该怎么办?我认为最好的开始是制作表格,以便student_id是主键?但即便如此,我也不确定如何从那里开始我可以获得该表的情况,它可以用来按月提供组和学生级数据。我对所有人提出的任何建议都非常开放,我几天都在思考这个问题,而且我一直跑到墙上,我不知道自己受到了哪些限制。技能和对sql的理解,以及我受到sql能力的限制(我认为我的大部分问题都是前者)。这甚至是我可以用sql和标准excel做的事情吗?我是否需要开始学习一些基本的视觉基础,如果是的话,你能指出我必须关注哪种代码的方向,这样我就可以开始自学了吗?

提前感谢所有阅读和贡献的人,知道我非常感谢他们的帮助!

1 个答案:

答案 0 :(得分:0)

也许这就是你需要的:

select year(up.[start_date]) [Year],month(up.[start_date]) [Month],up.Student_ID, up.activity, count(1) [count]
from activity_log l
unpivot (
[start_date] for [activity] in (outdoors_date, indoors_date, video_game_date)
) up
/*If You want just one month, then You can first filter just that month, and Youo don't need top group by year, and month*/
/*where year(up.[start_date])=2015
    and month(up.[start_date])=6*/
group by year(up.[start_date]),month(up.[start_date]), up.Student_ID, up.activity
相关问题