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

Sql 重新配置表以便它可以同时按2列分组的最佳方法是什么?,sql,sql-server,excel,sql-server-2008-r2,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

编辑:感谢所有到目前为止的回复,对不起,我原来的问题太混乱了。我会在这里澄清

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

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和至少一个特定的活动开始日期(虽然可以想象,在某些情况下,活动序列号行在两列或全部三列活动日期中都有一个学生ID和一个活动日期,就像他们在同一天在室内和室外一样)。在一天结束时,我不需要活动序列号……我所需要的只是一种关联特定学生ID的方法(这种情况经常出现)记录他们参与每项活动的次数,并能够在给定的一个月内对其进行细分,以了解个人或整个团队的活动参与情况如何变化。“学生333在2014年1月记录了17个室内活动日和14个视频游戏日,但在2014年2月,他记录了20个室内活动日和10个视频游戏日”,但也“在2014年11月,共有24万个户外活动(户外活动日),40万个室内活动日(室内日期和350000个视频游戏活动实例(视频游戏日期)。我对一天中的特定日期、时间或持续时间不感兴趣(因为我只有活动的开始时间,所以我无法测量),只对每个学生id的次数(然后是学生总数)感兴趣每月参加每项活动

谢谢你的书和方法建议丹,我会调查的。 阿农,我同意所有的观点…我很谦卑,有点不安,我不知道有多少在这一点上,虽然我正在尽可能快地自学,所以希望这不会永远持续下去。(虽然FWIW我只是列出了表格和行的大小,所以没有人会认为我可以直接将其放入excel来处理,因为我非常确定它对于excel来说太大了)

原职: 我想做的是统计表中每个人每月参加3项活动中的一项活动的次数。我需要创建一个最方便的表(然后将该表发送到excel,这样我就可以创建一个数据透视表+图表,允许人们按月查看总体活动参与趋势,然后根据个人选择查看每个人的活动参与趋势……但理想情况下,我希望让SQL尽可能多地完成繁重的工作)

我在sql server 2008 r2中工作,假设我正在跟踪学生的活动,以了解他们在做什么。我的表包含一个varchar(16)主键,基本上在任何学生表示他们参与了一个活动时生成(有数百万个这样的实例)。另一个varchar(255)由数十万个9位数的学生ID组成的行(这些ID对于每个学生都是唯一的,但在整个列中都是复制的,因为每个学生在任何给定的月份都参与多个活动…我没有将它们设置为255,这是在我的时间之前发生的)。然后是3个日期时间行,每个活动一个(户外、室内、视频游戏),包含他们当天参加活动的开始时间

由于我在这里的学习曲线的珠穆朗玛峰部分,我有点挣扎。我的第一组代码没有完成任何事情,真的……只是大量重复,远远不能满足我的需要,如果需要的话,我可以看到每个学生每个月都在做什么。(我删除了原来的垃圾代码,因为我觉得它太糟糕了,让人更加困惑)

所以我想问你的问题是,我该怎么做?我想最好的开始是制作表格,让学生id成为主键?但即使这样,我也不知道如何才能从那里得到表格,使其能够在excel中按月提供组和学生级数据。我真的对任何人都持开放态度任何人都有过这样的建议,我已经思考了好几天了,我不断地遇到一堵墙,我不知道我在哪里受到了我自己的技能和对sql的理解的限制,我在哪里受到了sql能力的限制(我想我的大部分问题都是前者)。这是我用sql和标准excel就能做到的吗?我是否需要开始学习一点visual basic,如果需要,你能告诉我,我必须在那里重点学习哪种代码,这样我才能开始自学吗


提前感谢所有阅读和投稿的人,我真的很感谢他们的帮助!

也许这就是你需要的:

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

你能给出一个你期望的输入和输出的例子吗?你能展示一下学生活动表的create table语句吗?我建议一个规范化的设计,其中包括学生和活动之间的多对多关系。如果你不知道这意味着什么,我听过这本书的好东西,《面向凡人的数据库设计》。你怎么能varchar(255)列包含数十万个9位数的学生ID?@SteveFord第一行包含00000000 1,第二行包含00000000 2,第三行包含00000000 3。我要继续吗?:)