问题描述
sql表如下:categoryidcategorynamecategoryintro1恋人对象12朋友对象23父母对象34病人对象15老师对象26客户对象3实现datagrid功能如下:对象1对象2对象3恋人朋友父母病人老师客户sql语句应该如何查找才对?谢谢!
解决方案
解决方案二:
/*普通行列转换(爱新觉罗.毓华2007-11-18于海南三亚)假设有张学生成绩表(tb)如下:NameSubjectResult张三语文 74张三数学 83张三物理 93李四语文 74李四数学 84李四物理 94*/-------------------------------------------------------------------------/*想变成姓名语文数学物理-------------------------------------------李四748494张三748393*/createtabletb(Namevarchar(10),Subjectvarchar(10),Resultint)insertintotb(Name,Subject,Result)values('张三','语文',74)insertintotb(Name,Subject,Result)values('张三','数学',83)insertintotb(Name,Subject,Result)values('张三','物理',93)insertintotb(Name,Subject,Result)values('李四','语文',74)insertintotb(Name,Subject,Result)values('李四','数学',84)insertintotb(Name,Subject,Result)values('李四','物理',94)go--静态SQL,指subject只有语文、数学、物理这三门课程。selectname姓名,max(casesubjectwhen'语文'thenresultelse0end)语文,max(casesubjectwhen'数学'thenresultelse0end)数学,max(casesubjectwhen'物理'thenresultelse0end)物理fromtbgroupbyname/*姓名语文数学物理-------------------------------------------李四748494张三748393*/--动态SQL,指subject不止语文、数学、物理这三门课程。declare@sqlvarchar(8000)set@sql='selectNameas'+'姓名'select@sql=@sql+',max(caseSubjectwhen'''+Subject+'''thenResultelse0end)['+Subject+']'from(selectdistinctSubjectfromtb)asaset@sql=@sql+'fromtbgroupbyname'exec(@sql)/*姓名数学物理语文-------------------------------------------李四849474张三839374*/-------------------------------------------------------------------/*加个平均分,总分姓名语文数学物理平均分总分--------------------------------------------------------------------------李四74849484.00252张三74839383.33250*/--静态SQL,指subject只有语文、数学、物理这三门课程。selectname姓名,max(casesubjectwhen'语文'thenresultelse0end)语文,max(casesubjectwhen'数学'thenresultelse0end)数学,max(casesubjectwhen'物理'thenresultelse0end)物理,cast(avg(result*1.0)asdecimal(18,2))平均分,sum(result)总分fromtbgroupbyname/*姓名语文数学物理平均分总分--------------------------------------------------------------------------李四74849484.00252张三74839383.33250*/--动态SQL,指subject不止语文、数学、物理这三门课程。declare@sql1varchar(8000)set@sql1='selectNameas'+'姓名'select@sql1=@sql1+',max(caseSubjectwhen'''+Subject+'''thenResultelse0end)['+Subject+']'from(selectdistinctSubjectfromtb)asaset@sql1=@sql1+',cast(avg(result*1.0)asdecimal(18,2))平均分,sum(result)总分fromtbgroupbyname'exec(@sql1)/*姓名数学物理语文平均分总分--------------------------------------------------------------------------李四84947484.00252张三83937483.33250*/droptabletb------------------------------------------------------------------------------------------------------------------/*如果上述两表互相换一下:即姓名语文数学物理张三74 83 93李四74 84 94想变成NameSubjectResult----------------------------李四语文74李四数学84李四物理94张三语文74张三数学83张三物理93*/createtabletb1(姓名varchar(10),语文int,数学int,物理int)insertintotb1(姓名,语文,数学,物理)values('张三',74,83,93)insertintotb1(姓名,语文,数学,物理)values('李四',74,84,94)select*from(select姓名asName,Subject='语文',Result=语文fromtb1unionallselect姓名asName,Subject='数学',Result=数学fromtb1unionallselect姓名asName,Subject='物理',Result=物理fromtb1)torderbyname,caseSubjectwhen'语文'then1when'数学'then2when'物理'then3when'总分'then4end--------------------------------------------------------------------/*加个平均分,总分NameSubjectResult-------------------------------------李四语文74.00李四数学84.00李四物理94.00李四平均分84.00李四总分252.00张三语文74.00张三数学83.00张三物理93.00张三平均分83.33张三总分250.00*/select*from(select姓名asName,Subject='语文',Result=语文fromtb1unionallselect姓名asName,Subject='数学',Result=数学fromtb1unionallselect姓名asName,Subject='物理',Result=物理fromtb1unionallselect姓名asName,Subject='平均分',Result=cast((语文+数学+物理)*1.0/3asdecimal(18,2))fromtb1unionallselect姓名asName,Subject='总分',Result=语文+数学+物理fromtb1)torderbyname,caseSubjectwhen'语文'then1when'数学'then2when'物理'then3when'平均分'then4when'总分'then5enddroptabletb1
解决方案三:
那在asp.net应该如何查找才对呢?
解决方案四:
编程/JAVA/.NET/C++群号:38850938
解决方案五:
--有空字段,暂未解决selectcategoryid,max(casecategoryintrowhen'对象1'thencategorynameelsenullend)对象1,max(casecategoryintrowhen'对象2'thencategorynameelsenullend)对象2,max(casecategoryintrowhen'对象3'thencategorynameelsenullend)对象3fromtgroupbycategoryid
解决方案六:
算了,SQL有点累,LZ把它读出来后用集合处理吧,很好弄//假设分别存放到三个集合中,可视情况再作处理(合并起来加个分隔符等)ArrayListarr1=newArrayList();ArrayListarr2=newArrayList();ArrayListarr3=newArrayList();DateTabledt=ReturnTable();//读出的记录集foreach(DataRowdrindt.Rows){stringcol1=dr["对象1"].ToString();stirngcol2=dr["对象2"].ToString();stirngcol2=dr["对象3"].ToString();if(col1.Length>0)arr1.Add(col1);//对象1的有效值集合if(col2.Length>0)arr2.Add(col1);//对象2的有效值集合if(col3.Length>0)arr3.Add(col1);//对象3的有效值集合}
解决方案七:
呵,后面的col1要相应的改一下,复制的没改全
解决方案八:
可以用vb.net写出来吗?谢谢了
解决方案九:
逻辑好复杂
解决方案十:
但是只能读出categoryid其他的不能读出来
解决方案十一:
如果我直接取出两行就很容易,但是从不同的行取出不同的字段,不知道如何搞PrivateSubbindgrid1()IfNotIsPostBackThenDimconAsNewSqlConnectionDimcmdAsNewSqlCommandDimdrAsSqlDataReadercon.ConnectionString=ConfigurationSettings.AppSettings("database")cmd.Connection=concmd.CommandType=CommandType.Textcmd.CommandText="select*fromdatabase"con.Open()dr=cmd.ExecuteReader()DataGrid1.DataSource=drDataGrid1.DataBind()dr1.Close()con.Close()EndIfdatagrid的属性生成器不知道如何设计才得到:datagrid功能如下:对象1对象2对象3恋人朋友父母病人老师客户
解决方案十二:
还没有解决,解决到我给全部分
解决方案十三:
接分先!