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 |