热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求教一个根据日期按周一至周日统计数据的SQL语句

现在有三张表bsn_com_record三项竞赛扣分加分表bsn_class_info班级信息表bsn_week_info学期周数表bsn_com_record表结构如下id:自增
现在有三张表
bsn_com_record 三项竞赛扣分加分表
bsn_class_info 班级信息表
bsn_week_info 学期周数表

bsn_com_record 表结构如下
id:自增字段[int]
c_id:对应班级信息表ID[int]
sort:分类(1:加分,2:扣分)[int]
score:分数[int]
wirteTime:记录时间[datetime]

bsn_class_info表结构如下
c_id:自增id[int]
c_name:班级名称[varchar]
y_id:隶属于哪一个学年[int]
其他字段不重要就不写了

bsn_week_info表结构如下
id:自增id
week_Name:代表第几周(例:第一周)[varchar]
w_stime:周开始时间[datetime]
w_etime:周结束时间[datetime]
y_id:隶属于哪一个学年[int]


现在的要求统计某一周各个班级从周一至周日的三项竞赛的成绩(每天加分的总和减去扣分),最后还需要一个汇总,
需要周一至周日的每天的分数情况,如没有扣分,就显示0(也就是说周一至周日是固定显示的)

图片如下


数据我例一些,请大神帮我一下,想了半天弄不出来

bsn_class_info
1,101班,1
2,102班,1
3,103班,1
4,201班,1
5,202班,1

bsn_week_info
1,第一周,2017-09-01,2017-09-08,1
2,第二周,2017-09-09,2017-09-16,1

bsn_com_record
1,1,1,2,2017-09-03
2,2,2,1,2017-09-03
3,1,2,1,2017-09-03
4,3,1,1,2017-09-05

7 个解决方案

#1


楼主百度一下 “行转列”

#2


其实不单单是行转列的问题,现在有一个问题是扣分与加分都是一样的数字,我统计的时候怎么处理?

#3


而且会出现,周几没有数据的情况,这种情况怎么显示出来?刚接触SQL,麻烦告之一下

#4


一周只有七天,用case语句把每天的数值查出来就好了:
SELECT CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 2 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周一' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 3 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周二' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 4 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周三' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 5 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周四' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 6 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周五' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 7 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周六' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 6 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周日'

#5


引用 4 楼 apollokk 的回复:
一周只有七天,用case语句把每天的数值查出来就好了:
SELECT CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 2 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周一' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 3 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周二' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 4 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周三' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 5 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周四' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 6 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周五' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 7 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周六' ,
       CASE DATEPART(WEEKDAY, GETDATE())
            WHEN 6 THEN CASE WHEN 1 = 1 THEN 1
                             ELSE 0
                        END
            ELSE 0
       END AS '周日'

单纯的周一至周日没有意义,能完整的根据我的需求写一个吗,因为涉及到周一至周日的统计以及根据选项的不同,加分项与减分项的扣除,以及列转行的问题

#6



with cte
as
(select c_id,case when sort =1 then score else 0-score end as score, wirtetime from bsn_com_record)

select MAX(c_name) as 班级,
       sum(case when DATEPART(WEEKDAY,writetime)=2 then score else 0 end) as 周一,
       sum(case when DATEPART(WEEKDAY,writetime)=3 then score else 0 end) as 周二,
       sum(case when DATEPART(WEEKDAY,writetime)=4 then score else 0 end) as 周三,
       sum(case when DATEPART(WEEKDAY,writetime)=5 then score else 0 end) as 周四,
       sum(case when DATEPART(WEEKDAY,writetime)=6 then score else 0 end) as 周五,
       sum(case when DATEPART(WEEKDAY,writetime)=7 then score else 0 end) as 周六,
       sum(case when DATEPART(WEEKDAY,writetime)=1 then score else 0 end) as 周日,
       SUM(score) as 汇总
from bsn_class_info A
left join cte B on A.c_id=B.c_id
left join bsn_week_info C on B.writetime between C.w_stime AND C.w_etime
where C.week_name='第几周'
group by A.c_id

#7


引用 6 楼 RINK_1 的回复:

with cte
as
(select c_id,case when sort =1 then score else 0-score end as score, wirtetime from bsn_com_record)

select MAX(c_name) as 班级,
       sum(case when DATEPART(WEEKDAY,writetime)=2 then score else 0 end) as 周一,
       sum(case when DATEPART(WEEKDAY,writetime)=3 then score else 0 end) as 周二,
       sum(case when DATEPART(WEEKDAY,writetime)=4 then score else 0 end) as 周三,
       sum(case when DATEPART(WEEKDAY,writetime)=5 then score else 0 end) as 周四,
       sum(case when DATEPART(WEEKDAY,writetime)=6 then score else 0 end) as 周五,
       sum(case when DATEPART(WEEKDAY,writetime)=7 then score else 0 end) as 周六,
       sum(case when DATEPART(WEEKDAY,writetime)=1 then score else 0 end) as 周日,
       SUM(score) as 汇总
from bsn_class_info A
left join cte B on A.c_id=B.c_id
left join bsn_week_info C on B.writetime between C.w_stime AND C.w_etime
where C.week_name='第几周'
group by A.c_id

万分感谢,学到不少东西.

推荐阅读
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • MySQL外键1对多问题的解决方法及实例
    本文介绍了解决MySQL外键1对多问题的方法,通过准备数据、创建表和设置外键关联等步骤,实现了用户分组和插入数据的功能。详细介绍了数据准备的过程和外键关联的设置,以及插入数据的示例。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
心之约会446
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有