Office中国论坛/Access中国论坛

标题: 求一SQL [打印本页]

作者: zshowell    时间: 2006-3-28 21:33
标题: 求一SQL
原表:

key1 key2 key3

a 21 11
b 11 11
a 11 13
b 11 15
a 12 12
b 10 8

生成如下表:

key1 key2 key3

a1 21 11
a2 11 13
a3 12 12
b1 11 11
b2 11 15
b3 10 8


我以前好似做过,现在唔记得点做了,也不知在这个站从何查起,请各位指点一下
作者: sgrshh29    时间: 2006-3-28 22:08
这是一个很困难的问题,原表与生成表有什么逻辑关系呢?要不在查询中先添加一个编号字段,再对a、b排序,后生成表。

[此贴子已经被作者于2006-3-28 14:10:16编辑过]


作者: zshowell    时间: 2006-3-28 22:21
嗯关键是将 a...b ... 变为a1 a2.. ..b1..b2...

这个编号应该怎么加上去呢?

我印象中好似是用子查询去做的,现在就是记不起....

做完这步,我还要对这个表再作下一步的交叉查询...
作者: zshowell    时间: 2006-3-28 22:37
谢谢sgrshh29的提醒,经过查找旧贴找到

SELECT 表1.mc, DCount("*","表1","[mc]='" & [mc] & "'and [id]<=" & [id]) AS 表达式1
FROM 表1;

应该可以做到,但SQL2000中好似无DCOUNT的做法,试试用这个原理做做先,再次感谢[em02]
作者: wwwwa    时间: 2006-3-28 22:46
ACCESS2000:

SELECT *
FROM [SELECT A.*,KEY1 & (SELECT COUNT(*) FROM B105T WHERE A.KEY3>=KEY3 AND A.KEY1=KEY1) AS DF FROM B105T A ORDER BY 4 ]. AS [%$##@_Alias]
ORDER BY DF;

作者: sgrshh29    时间: 2006-3-28 23:05
如果记录数很多,还是用ado或dao比较快。
作者: wu8313    时间: 2006-3-29 01:50
以下是引用wwwwa在2006-3-28 14:46:00的发言:


ACCESS2000:

SELECT *
FROM [SELECT A.*,KEY1 & (SELECT COUNT(*) FROM B105T WHERE A.KEY3>=KEY3 AND A.KEY1=KEY1) AS DF FROM B105T A ORDER BY 4 ]. AS [%$##@_Alias]
ORDER BY DF;



很是 叹服 wwwwa 和 sgrshh29 在论坛中给出的很多查询。

能否发个您认为较好的教程给我们学习一下,谢谢!

[此贴子已经被作者于2006-3-28 17:50:17编辑过]


作者: andymark    时间: 2006-3-29 04:41
用ADO做的例子

[attach]16742[/attach]

作者: zshowell    时间: 2006-3-29 18:07
多谢各位的热情指点
但还是未有成功

SELECT keyid, ID, 物种,
          (SELECT COUNT(*)
         FROM dbo.初步一览资料
         WHERE 初步一览资料.keyid <= keyid AND 初步一览资料.物种 = 物种 AND
               初步一览资料.ID = ID) AS 列头
FROM dbo.初步一览资料

我用此形式得到的只是"初步一览资料"记录总数
说明一下,其中物种只有单一一个字如"布","印","线"....这类的单个物料
keyid 为表中的唯一的不连续的编号,ID为某张单的唯一识别号

初步一览资料
keyid id 物种
1 11 布
3 11 布
5 11 布
6 11 布
9 11 布
12 11 印
15 11 印
16 11 印
2 12 布
4 12 布
11 12 线
13 12 线


现在的结果是:
keyid id 物种 列头
1 11 布 12
3 11 布 12
5 11 布 12
6 11 布 12
9 11 布 12
12 11 印 12
15 11 印 12
16 11 印 12
2 12 布 12
4 12 布 12
11 12 线 12
13 12 线 12


我想得到的结果是这样:
keyid id 物种 列头
1 11 布 1
3 11 布 2
5 11 布 3
6 11 布 4
9 11 布 5
12 11 印 1
15 11 印 2
16 11 印 3
2 12 布 1
4 12 布 2
11 12 线 1
13 12 线 2



作者: andymark    时间: 2006-3-29 18:16
ADO做的例子已经可以实现你的结果,
作者: zshowell    时间: 2006-3-29 18:23
因为这只是一部分东西,且是ADP+SQL2000的,所以想用T-SQL存储过程来做这件事
作者: wwwwa    时间: 2006-3-29 19:10
SELECT keyid, ID, 物种,
          (SELECT COUNT(*)
         FROM b105a
         WHERE a.keyid >=keyid AND a.物种 = 物种 AND
               a.ID = ID) AS 列头
FROM b105a a
作者: zshowell    时间: 2006-3-29 19:27
嗯...成功了!

好慢... 19xxx条记录都执行时会提示"超时已过期"

过滤到五十几条记录时,七八秒显示出正确结果...
作者: wuaza    时间: 2006-3-29 20:58
andymark 的逻辑思维好棒,你的ado例子值得学习。
作者: zshowell    时间: 2006-3-29 22:15
难道用SQL做真的只能这样慢?
作者: wwwwa    时间: 2006-3-29 22:52
以下是引用zshowell在2006-3-29 14:15:00的发言:
难道用SQL做真的只能这样慢?



try:

SELECT 物种, keyid, id,count(*)
FROM (SELECT a.[keyid], a.[ID], a.[物种] FROM b105a AS a left join b105a b
on a.keyid>=b.keyid AND a.物种 = b.物种 AND  a.ID = b.ID)
GROUP BY 物种, keyid,id order by 物种, id,keyid
应该快一些
作者: zshowell    时间: 2006-3-29 23:19
哗!快了好多倍!

谢谢你 WWWWA!
作者: zshowell    时间: 2006-3-29 23:23
正如wu8313所讲,能否告诉我们,你们在学习SQL时经历了些什么途径?
作者: wwwwa    时间: 2006-3-29 23:32
以下是引用wu8313在2006-3-28 17:50:00的发言:





很是 叹服 wwwwa 和 sgrshh29 在论坛中给出的很多查询。

能否发个您认为较好的教程给我们学习一下,谢谢!

其实没有捷径,多练习、多在论坛上学习。
作者: zshowell    时间: 2006-3-29 23:36
谢谢!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3