一些关于SQL数据取得的问题(100分)

  • 主题发起人 主题发起人 tingchao
  • 开始时间 开始时间
T

tingchao

Unregistered / Unconfirmed
GUEST, unregistred user!
原始表数据如下:
线名 杆号 日期
a 1 2003-01-01
a 1 2002-01-01
a 1 2001-01-01
a 2 2003-01-01
a 2 2002-01-01
a 2 2001-01-01
b 1 2003-01-01
b 1 2002-01-01
b 2 2003-01-01
b 2 2002-01-01
要求得到的结果如下(注:结果集是最大日期下的每个线名,每个杆号)
线名 杆号 日期
a 1 2003-01-01
a 2 2003-01-01
b 1 2003-01-01
b 2 2003-01-01
该结果是否能用一条SQL语句实现,如果没有,能否有其他办法的建议???
解决的办法如下:
select 线名,杆名,max(日期)
from tablename
group by 线名,杆名
现在还有个问题了.
假如我基础表加了几个字段如下:
原始表数据如下:
线名 杆号 日期 a b c d
a 1 2003-01-01 1 1 1 1
a 1 2002-01-01 2 2 2 2
a 1 2001-01-01 3 3 3 3
a 2 2003-01-01 4 4 4 4
a 2 2002-01-01 5 5 5 5
a 2 2001-01-01 6 6 6 6
b 1 2003-01-01 7 7 7 7
b 1 2002-01-01 8 8 8 8
b 2 2003-01-01 9 9 9 9
b 2 2002-01-01 10 10 10 10
要得到的结果如下:
线名 杆号 日期 a b c d
a 1 2003-01-01 1 1 1 1
a 2 2003-01-01 4 4 4 4
b 1 2003-01-01 7 7 7 7
b 2 2003-01-01 9 9 9 9
现在该要怎么做呢?????
 
select distinct 线名,杆号........(你所选的字段) from tablename
[red]不过我不禁要问一句,
问题好像太过于简单,
楼主是不是在耍我们?[/red]
 
不是啊是要求最大的日期的啊.......
 
请各位帮帮忙好不好???
急啊!!!
 
怪我没有看清楚,一开始我还以为你是在倒分呢!嘿~~~嘿!
向你道歉!
顺便说一句,没有什么其它办法,列出多少字段就要GROUP BY 多少字段。
 
楼主的问题估计只能使用存储过程,并结合游标来实现了,
估计速度会比较慢。
 
请问chnplzh要怎么做呢???
 
请大家帮帮忙啊,给个建议个可以的啊.
 
我以前已经回答过很多类似的帖子了
 
现在全文检索不能用了,再回答一次
select 线名,杆号,max(日期),
(select a from tablename t2 where t1.线名=t2.线名 and t1.杆号=t2.杆号 and t1.日期=t2.日期) as a1,
(select b from tablename t3 where t1.线名=t3.线名 and t1.杆号=t3.杆号 and t1.日期=t3.日期) as b1,
(select c from tablename t4 where t1.线名=t4.线名 and t1.杆号=t4.杆号 and t1.日期=t4.日期) as c1,
(select d from tablename t5 where t1.线名=t5.线名 and t1.杆号=t5.杆号 and t1.日期=t5.日期) as d1
from tablename t1
group by 线名,杆名
 
就按breezee的做法就可以了
或者这样:
select t1.线名,t1.杆号,max(t1.日期),t2.a,t3.b,t4.c,t5.d
from tablename t1 left join tablename t2 on t1.线名=t2.线名 and t1.杆号=t2.杆号 and t1.日期=t2.日期
left join tablename t3 on t1.线名=t3.线名 and t1.杆号=t3.杆号 and t1.日期=t3.日期
left join tablename t4 on t1.线名=t4.线名 and t1.杆号=t4.杆号 and t1.日期=t4.日期
left join tablename t5 on t1.线名=t5.线名 and t1.杆号=t5.杆号 and t1.日期=t5.日期
group by t1.线名,t1.杆名
 
精彩!
我第一次看到这么用的.
但我不知道可不可以,我试试!
 
不过还是不行的啊.
系统给出的提示是:
试图执行的查询中不包含作为合计函数一部分的特定表达式"日期"
为什么啊.
是不是数据库系统有区别??
我是用ACCESS 2000 测试的.
 
我还没给分呢.
谁能帮我解决我100分全给他!
 
没在ACCESS 2000下试过
把所有中文字段名加上[]试试
 
to breezee,不是这个问题的啊,我有给出出错的提示信息啊.
[red]试图执行的查询中不包含作为合计函数一部分的特定表达式"日期"[/red]
 
用途是一样的,才写完还没优化,将就着看吧!
use tempdb
if exists (select id from sysobjects where id=object_id('#t_temp'))
drop table #t_temp
use LyjcERP_NB
create table #t_temp
( 工序名称 varchar (255),工步内容 varchar (255),技术标准 varchar (255),工卡量具 varchar (255),工步编码 char (10),
项目名称 varchar (255),标准值 varchar (255),物料名称 varchar (255),材质规格 varchar (255), 数量 varchar (255),
单位 varchar (255),提前期 varchar (255),工时定额 varchar (255),工艺图号 varchar (255),控制手段 varchar (255),
天数 varchar (255),备注 varchar (255))
SET NOCOUNT ON
DECLARE @c_gx varchar(60),@c_gb varchar(60),@c_message varchar(100),
@工序名称 varchar (255),@工步内容 varchar (255),@技术标准 varchar (255),
@工卡量具 varchar (255), @工步编码 char (10),@项目名称 varchar (255), @标准值 varchar (255),
@物料名称 varchar (255), @材质规格 varchar (255), @数量 varchar (255),@单位 varchar (255),
@提前期 varchar (255),@工时定额 varchar (255),@工艺图号 varchar (255), @控制手段 varchar (255),
@天数 varchar (255),@备注 varchar (255)
DECLARE first_cursor CURSOR FOR
SELECT distinct 工序名称
FROM DF4B_BOM_JCGB00
OPEN first_cursor
FETCH NEXT FROM first_cursor
INTO @c_gx
WHILE @@FETCH_STATUS = 0
begin

DECLARE second_cursor CURSOR FOR
SELECT 工序名称,工步内容,技术标准,工卡量具,工步编码,项目名称,标准值,物料名称,材质规格,数量,单位,提前期,工时定额,工艺图号,控制手段,天数,备注
FROM DF4B_BOM_JCGB00
WHERE 工序名称 = @c_gx
OPEN second_cursor
FETCH NEXT FROM second_cursor INTO
@工序名称,@工步内容,@技术标准,@工卡量具,@工步编码,@项目名称,@标准值,@物料名称,@材质规格,@数量,@单位,@提前期,@工时定额,@工艺图号,@控制手段,@天数,@备注

select @c_gb=@工步内容
WHILE @@FETCH_STATUS = 0
begin
--select --@c_gx
IF NOT EXISTS(SELECT * FROM #t_temp where 工序名称=@c_gx and 工步内容=@c_gb)
begin
--select @c_message='不存在'+@c_gx+@c_gb
INSERT INTO #t_temp(工序名称,工步内容,技术标准,工卡量具,工步编码,项目名称,标准值,物料名称,材质规格,数量,单位,提前期,工时定额,工艺图号,控制手段,天数,备注)
VALUES(@工序名称,@工步内容,@技术标准,@工卡量具,@工步编码,@项目名称,@标准值,@物料名称,@材质规格,@数量,@单位,@提前期,@工时定额,@工艺图号,@控制手段, @天数,@备注)
PRINT(RTRIM(CONVERT(varchar(30),@工序名称+@工步内容)) )
END
else
begin
PRINT('存在')
END
FETCH NEXT FROM second_cursor INTO
@工序名称,@工步内容,@技术标准,@工卡量具,@工步编码,@项目名称,@标准值,@物料名称,@材质规格,@数量,@单位,@提前期,@工时定额,@工艺图号,@控制手段,@天数,@备注
END
CLOSE second_cursor
DEALLOCATE second_cursor

FETCH NEXT FROM first_cursor
INTO @c_gx
END
CLOSE first_cursor
DEALLOCATE first_cursor
SELECT TR_工序.工序编码,t.工步内容,t.技术标准,t.工卡量具,t.工步编码,t.项目名称,t.标准值,t.物料名称,t.材质规格,t.数量,t.单位,t.提前期,t.工时定额,t.工艺图号,t.控制手段,t.天数,t.备注
FROM #t_temp t ,TR_工序
WHERE TR_工序.工序名称=t.工序名称
GO
 
我来写个简单的,理论上可以,你调试一下就行了。
Select distinct X.线名,X.杆号,X.日期,Y.a,Y.b,Y.c,Y.d from
(select t1.线名,t1.杆号,max(t1.日期) 日期 from tablename t1
group by group by t1.线名,t1.杆名 ) X , tableName Y
where X.线名=Y.线名 and X.杆号=Y.杆号 and X.日期=Y.日期
 
后退
顶部