以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  sql 生成某列的数据时,不满足条件=0 或 空值,怎么改我的代码?  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=15251)

--  作者:e-png
--  发布时间:2011/12/18 17:28:00
--  sql 生成某列的数据时,不满足条件=0 或 空值,怎么改我的代码?
sql 生成某列的数据时,不满足条件=0 或 空值,怎么改我的代码?  发帖心情 Post By:2011-12-18 17:27:00 [只看该作者]

select (Select Max(分数) from {数据库} where 科目 = \'数学\') as 分数 from {数据库}

 

下面面只想有一个 8 ,其他都为空 或 0  ,该怎么该条件? 


图片点击可在新窗口打开查看此主题相关图片如下:未命名sql.jpg
图片点击可在新窗口打开查看

--  作者:yangming
--  发布时间:2011/12/18 18:22:00
--  

select TOP 1 (Select Max(分数) from {数据库} where 科目 = \'数学\') as 分数 from {数据库}

我觉得下面的代码更直观一些,呵

select TOP 1 (Select Max(分数) from {数据库} where 科目 = \'数学\') as 数学最大值 from {数据库}

[此贴子已经被作者于2011-12-18 18:25:14编辑过]

--  作者:e-png
--  发布时间:2011/12/18 18:26:00
--  
我是要全部的行,但只有那个最大的数显示在它本来的行的位置. 其他都要求空值或0
--  作者:yangming
--  发布时间:2011/12/18 18:30:00
--  
那没必要这么做吧,呵呵,只要排序不就行了,呵
--  作者:e-png
--  发布时间:2011/12/18 18:34:00
--  
yang版不一样的,^_^   我弄出来了:select iif((Select Max(分数) from {数据库} where 科目 = \'数学\')=分数,分数,"") as 分数 from {数据库}
--  作者:yangming
--  发布时间:2011/12/18 19:27:00
--  

学习了,呵呵,只是我不太明白,你为何要这样的结果呢,如果是我,我更喜欢下面的代码:

 

Select 班级, 姓名 ,科目 ,分数 From {数据库} where 分数 = (Select Max(分数) from {数据库} where 科目 = \'数学\')


--  作者:e-png
--  发布时间:2011/12/18 19:57:00
--  

yang版,在sql命令窗口运行以下代码就知道了:    不过科目多了代码就太长了,呵呵 只是学习用的.

 

select 班级,姓名,科目,iif((Select Max(分数) from {数据库} where 科目 = \'数学\')=分数,分数,"") As 数学,iif((Select Max(分数) from {数据库} where 科目 = \'语文\') = 分数,分数,"") as 语文,iif((Select Max(分数) from {数据库} where 科目 = \'政治\')=分数,分数,"") as 政治 from {数据库}  

 

这样做交叉统计就简单多了,只是三个统计列都是空值的行要能不显示出来就好了(当然在foxtable中再处理掉这些空值行也是简单的事).  不知那位高手能否赐教. 我弄了几个小时不得要领啊.

 


图片点击可在新窗口打开查看此主题相关图片如下:未命名sql0.jpg
图片点击可在新窗口打开查看
[此贴子已经被作者于2011-12-18 20:06:18编辑过]

--  作者:yangming
--  发布时间:2011/12/18 20:29:00
--  
你如果直接将表格的格式改成,科目列都为列名,比如,数学,语文,外语,都做成列,那做交叉统计不是更方便了?
--  作者:e-png
--  发布时间:2011/12/18 20:52:00
--  
只是学习,没有做什么 ^_^.
--  作者:yangming
--  发布时间:2011/12/18 20:56:00
--  
以下是引用e-png在2011-12-18 20:52:00的发言:
只是学习,没有做什么 ^_^.

这段代码,可以将表A转化成表B,呵呵

Dim dtb As New DataTableBuilder("B")

dtb.AddDef("姓名", Gettype(String), 32)

For Each v As String In DataTables("A").GetUniqueValues("","课程")

    dtb.AddDef(v, Gettype(Double))

Next

dtb.Build()

For Each v As String In DataTables("A").GetUniqueValues("","姓名")

    Dim dr1 As DataRow = DataTables("B").AddNew()

    dr1("姓名") = v

    For Each dr2 As DataRow In DataTables("A").DataRows

        If dr2("姓名") = v Then

            dr1(dr2("课程")) = dr2("分数")

        End If

    Next

Next

MainTable = Tables("表B")