问题描述
我们每天提交记录,然后到月底将所有记录汇总起来,格式如下请问用什么好方法可以做出来呢?
解决方案
解决方案二:
tablegridview很多都可
解决方案三:
放到数据库中
解决方案四:
懂的朋友,请大家说明白一点.加分哦
解决方案五:
楼主还应该加上,如果某天某项没有数据则补0...或为空。一条sql语句就出来了。
解决方案六:
再顶一下吧
解决方案七:
我也顶一个`
解决方案八:
gridview绑定在一个ds上,ds来源于一个sql语句。sql中如果某天某项没有数据则补0...或为空
解决方案九:
再顶一个,求一个详细介绍
解决方案十:
楼主是不是考虑到数据列不固定,也就是每个月的天数不固定,有30天的,有31天的,还有28(29)天的。如果是这样,可以考虑先把所需数据(单项值、合计值)取出来组一DataTable,确定列数后再绑到DataList或GridView上。
解决方案十一:
这是个交叉表应用,就是把数据行上的日期竖起来可以用SQL交叉表来做可以参考http://topic.csdn.net/u/20080121/23/883c844b-eeb7-4b48-97cb-29ff0a257902.html也可以用RDLC或水晶报表的交叉表来做
解决方案十二:
楼主的问题并不是一个简单问题,要考虑的东西是比较多的,1.一个月的天数是不固定的;2.要考虑2月份有29天的,既要有闰月的判断;3.某天某项没有数据则补0...或为空;
解决方案十三:
注意看有个动态SQL普通行列转换问题:假设有张学生成绩表(tb)如下:姓名课程分数张三语文74张三数学83张三物理93李四语文74李四数学84李四物理94想变成(得到如下结果):姓名语文数学物理----------------李四748494张三748393-------------------*/createtabletb(姓名varchar(10),课程varchar(10),分数int)insertintotbvalues('张三','语文',74)insertintotbvalues('张三','数学',83)insertintotbvalues('张三','物理',93)insertintotbvalues('李四','语文',74)insertintotbvalues('李四','数学',84)insertintotbvalues('李四','物理',94)go--SQLSERVER2000静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)select姓名as姓名,max(case课程when'语文'then分数else0end)语文,max(case课程when'数学'then分数else0end)数学,max(case课程when'物理'then分数else0end)物理fromtbgroupby姓名--SQLSERVER2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)declare@sqlvarchar(8000)set@sql='select姓名'select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'from(selectdistinct课程fromtb)asaset@sql=@sql+'fromtbgroupby姓名'exec(@sql)--SQLSERVER2005静态SQL。select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b--SQLSERVER2005动态SQL。declare@sqlvarchar(8000)select@sql=isnull(@sql+',','')+课程fromtbgroupby课程exec('select*from(select*fromtb)apivot(max(分数)for课程in('+@sql+'))b')---------------------------------/*问题:在上述结果的基础上加平均分,总分,得到如下结果:姓名语文数学物理平均分总分--------------------------李四74849484.00252张三74839383.33250*/--SQLSERVER2000静态SQL。select姓名姓名,max(case课程when'语文'then分数else0end)语文,max(case课程when'数学'then分数else0end)数学,max(case课程when'物理'then分数else0end)物理,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名--SQLSERVER2000动态SQL。declare@sqlvarchar(8000)set@sql='select姓名'select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'from(selectdistinct课程fromtb)asaset@sql=@sql+',cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名'exec(@sql)--SQLSERVER2005静态SQL。selectm.*,n.平均分,n.总分from(select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b)m,(select姓名,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名)nwherem.姓名=n.姓名--SQLSERVER2005动态SQL。declare@sqlvarchar(8000)select@sql=isnull(@sql+',','')+课程fromtbgroupby课程exec('selectm.*,n.平均分,n.总分from(select*from(select*fromtb)apivot(max(分数)for课程in('+@sql+'))b)m,(select姓名,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名)nwherem.姓名=n.姓名')droptabletb------------------------------------/*问题:如果上述两表互相换一下:即表结构和数据为:姓名语文数学物理张三74 83 93李四74 84 94想变成(得到如下结果):姓名课程分数------------李四语文74李四数学84李四物理94张三语文74张三数学83张三物理93--------------*/createtabletb(姓名varchar(10),语文int,数学int,物理int)insertintotbvalues('张三',74,83,93)insertintotbvalues('李四',74,84,94)go--SQLSERVER2000静态SQL。select*from(select姓名,课程='语文',分数=语文fromtbunionallselect姓名,课程='数学',分数=数学fromtbunionallselect姓名,课程='物理',分数=物理fromtb)torderby姓名,case课程when'语文'then1when'数学'then2when'物理'then3end--SQLSERVER2000动态SQL。--调用系统表动态生态。declare@sqlvarchar(8000)select@sql=isnull(@sql+'unionall','')+'select姓名,[课程]='+quotename(Name,'''')+',[分数]='+quotename(Name)+'fromtb'fromsyscolumnswherename!=N'姓名'andID=object_id('tb')--表名tb,不包含列名为姓名的其它列orderbycolidascexec(@sql+'orderby姓名')--SQLSERVER2005动态SQL。select姓名,课程,分数fromtbunpivot(分数for课程in([语文],[数学],[物理]))t--SQLSERVER2005动态SQL,同SQLSERVER2000动态SQL。--------------------/*问题:在上述的结果上加个平均分,总分,得到如下结果:姓名课程分数----------------李四语文74.00李四数学84.00李四物理94.00李四平均分84.00李四总分252.00张三语文74.00张三数学83.00张三物理93.00张三平均分83.33张三总分250.00------------------*/select*from(select姓名as姓名,课程='语文',分数=语文fromtbunionallselect姓名as姓名,课程='数学',分数=数学fromtbunionallselect姓名as姓名,课程='物理',分数=物理fromtbunionallselect姓名as姓名,课程='平均分',分数=cast((语文+数学+物理)*1.0/3asdecimal(18,2))fromtbunionallselect姓名as姓名,课程='总分',分数=语文+数学+物理fromtb)torderby姓名,case课程when'语文'then1when'数学'then2when'物理'then3when'平均分'then4when'总分'then5enddroptabletb一道sql的题目:原表结构如下学号姓名性别年龄2061403张三男212061404李四男222061405王五男212061406陈六男23修改后的结构为:学号2061403206140420614052061406姓名张三李四王五陈六性别男男男男年龄21222123请问用sql语句怎么做啊?谢谢!Ifobject_id('ta')isnotnullDroptabletaGoCreatetableta(xhint,xmnvarchar(2),xbnvarchar(1),nlint)GoInsertintotaselect2061403,'张三','男',21unionallselect2061404,'李四','男',22unionallselect2061405,'王五','男',21unionallselect2061406,'陈六','男',23Go--Startselectid=identity(int,1,1),xhinto#fromtadeclare@svarchar(8000)declare@s1varchar(8000)declare@s2varchar(8000)declare@s3varchar(8000)select@s=isnull(@s+',','')+'[col'+ltrim(id)+']=max(casewhenxh='+ltrim(xh)+'thenltrim(xh)elsenullend)'from#set@s='select''学号''ascol0,'+@s+'fromtaunionall'select@s1=isnull(@s1+',','')+'[col'+ltrim(id)+']=max(casewhenxh='+ltrim(xh)+'thenxmelsenullend)'from#set@s1='select''姓名''ascol0,'+@s1+'fromtaunionall'select@s2=isnull(@s2+',','')+'[col'+ltrim(id)+']=max(casewhenxh='+ltrim(xh)+'thenxbelsenullend)'from#set@s2='select''性别''ascol0,'+@s2+'fromtaunionall'select@s3=isnull(@s3+',','')+'[col'+ltrim(id)+']=max(casewhenxh='+ltrim(xh)+'thenltrim(nl)elsenullend)'from#set@s3='select''年龄''ascol0,'+@s3+'fromta'exec(@s+@s1+@s2+@s3)droptable#--Result:/*col0col1col2col3col4----------------------------------------------------学号2061403206140420614052061406姓名张三李四王五陈六性别男男男男年龄21222123
解决方案十四:
11楼的想法多虑,其实可以理解为个视图,每月得张表就是了,每月有多少天,就做多少天你可能每天提交的时间是精确到秒的,分组的时候就DAY(DATETIME字段)