Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

对每一记录行的多个字段进行比较排名,和条件查询指定字段值的问题

一牧歌  发表于:2020-11-07 13:57:58  
复制

在监测分析中遇到了这个问题,在网上查找了很多解决办法,都没有得到满意结果,采用Excel还容易解决,但用Access就难住了,这些数据只能通过Access处理才方便。哪位高手帮帮忙,希望能用Access完美解决。

观察区域是10个监测点(床位),每天记录着各个监测点的数据:每天对这10个监测点的数据进行排序,需要通过创建一个查询得出下面这个表:

并得“首例恶化床位”在当天的体征的排名。

点击下载此附件

 

Top
西出阳关无故人 发表于:2020-11-09 15:06:24

创建一个模块,添加如下自定义函数:

Public Function myOrder(ByVal myid As Long) As Integer
    Dim CW As Integer
    Dim ZS As Double
    Dim i As Integer
    Dim PM As Integer
    Dim rst As Recordset
    Set rst = CurrentDb.OpenRecordset("select * from 生命综合指数记录表 where id=" & myid)
    CW = rst.Fields("首例恶化床位")
    ZS = rst.Fields("床位" & Format(CW, "00"))
    PM = 1
    For i = 1 To 10
        If ZS <= rst.Fields("床位" & Format(i, "00")) And i <> CW Then
            PM = PM + 1
        End If
    Next i
    rst.Close
    myOrder = PM
End Function
Public Function allOrder(ByVal myid As Long, zdcw As Integer) As Integer
    Dim CW As Integer
    Dim ZS As Double
    Dim i As Integer
    Dim PM As Integer
    Dim rst As Recordset
    Set rst = CurrentDb.OpenRecordset("select * from 生命综合指数记录表 where id=" & myid)
    CW = zdcw
    ZS = rst.Fields("床位" & Format(CW, "00"))
    PM = 1
    For i = 1 To 10
        If ZS <= rst.Fields("床位" & Format(i, "00")) And i <> CW Then
            PM = PM + 1
        End If
    Next i
    rst.Close
    allOrder = PM
End Function




再创建一个查询如下:


SELECT 生命综合指数记录表.ID, 生命综合指数记录表.日期, 生命综合指数记录表.首例恶化床位, MYORDER([ID]) AS 恶化床位的排名, allorder([id],1) AS 床位01, allorder([id],2) AS 床位02, allorder([id],3) AS 床位03, allorder([id],4) AS 床位04, allorder([id],5) AS 床位05, allorder([id],6) AS 床位06, allorder([id],7) AS 床位07, allorder([id],8) AS 床位08, allorder([id],9) AS 床位09, allorder([id],10) AS 床位10
FROM 生命综合指数记录表;



运行查询即可 得到需要的结果.




一牧歌 发表于:2020-11-12 10:34:56
非常感谢“西出阳关无故人”的出手相助,确实很有效,而且数据处理速度也很快,充分展现出强大的专业实力,敬佩。
问题是不能应用到其它表的处理,因为我们需要处理的类似表有很多,主题上提到的这个例子只是这个类似的典型。
由于我是学医的,数据库是业余爱好,在VB方面功底非常薄弱,为了能通用性,我啄磨两天也示能彻底解决:想弄成很通用性的自定义函数。
函数使用方式:
行排名(表名,查询字段,字段1,字段2,字段3,字段4,...,字段N)  

条件字段取值(条件字段名,查询表名) 也就是说条件字段名的值,作为条件字符串(也可以直接填写“字符串”内容),查询这个表中含有字符串的字段的本行记录值。

本例子应用:我分两步走

[字段床位01排名:=行排名("生命综合批数记录表","床位01",[床位01],[床位02],[床位03],[床位04],[床位05],[床位06],[床位07],[床位08],[床位09],[床位10])

另生成一个查询表“表2“

再应用”表2“

恶化床位的排名:=条件字段取值(首例恶化床位,表2)



西出阳关无故人 发表于:2020-11-16 09:47:25

尝试理解一下你的表结构:不同的表,除了表名称/床位号不同以外,id/日期/首例恶化床位三个字段名相同.比如

表1:id,日期,首例恶化床位,床位01,床位02,...,床位10

表2:id,日期,首例恶化床位,床位11,床位12,...,床位20

...

是这样吗?



一牧歌 发表于:2020-11-16 23:50:22
不好意思,是本人表达能力有限,辛苦你了。
基本上是你这样理解的。
只不过“首例恶化床位”也是不同,用在生化指标方面就有“首例转氨酶升高床位”、“首例白蛋白下降床位”、“首例肌酐升高床位”等等。


西出阳关无故人 发表于:2020-11-17 09:34:54

建议:

更改表结构为    记录表(id,日期,指标类别,首例,床位,数据)

其中,指标类别记录恶化/转氨酶升高/白蛋白下降/肌酐升高...,首例记录首例床位,床位记录床位号,数据记录某床位的指标数据.也就是把你的交叉表格式转化为普通表的格式.

这样可以避免因床位增加导致单个表的字段数增加,同时避免因为指标类别的增加而增加表的情况.一个成熟的数据库不应该随时增加表或字段,否则查询/函数/窗体等都要变更.

现有数据可以通过追加查询到"记录表"中,例如:

INSERT INTO 记录表 ( 日期, 首例床位, 数值, 床位号, 指标类别 )
SELECT 生命综合指数记录表.日期, 生命综合指数记录表.首例恶化床位, 生命综合指数记录表.床位01, "01" AS 床位, "恶化" AS 指标类别
FROM 生命综合指数记录表;

INSERT INTO 记录表 ( 日期, 首例床位, 数值, 床位号, 指标类别 )
SELECT 生命综合指数记录表.日期, 生命综合指数记录表.首例恶化床位, 生命综合指数记录表.床位02, "02" AS 床位, "恶化" AS 指标类别
FROM 生命综合指数记录表;

...

这样,会更好进行排序.当然,排序的函数要进行更改.



一牧歌 发表于:2020-11-17 12:12:40
谢谢回复!


你的思路很好,我确实也审视过我的数据结构的问题,但改结构工程量很大,还可能出现意想不到其它问题。
我觉得1楼的答案正是我需要的结果,只不过要能让我方便应用到其它的表中去,所以至少需要“表”名称能够自行指定。


我的设想是,在1楼的基础上把“表”名改成变量,由我们自己定义就OK了。


能编成一个用语法的自定义函数当然最好。


总记录:6篇  页次:1/1 9 1 :