请教一条SQL语句

yucong 2009-04-14 10:02:15
加精
已知如下表结构

[名称] [时间] [状态]

汽车A 2001-1-1 1:1:1 出发
汽车A 2001-1-1 2:2:2 返回
汽车B 2001-1-1 3:3:3 出发
汽车C 2001-1-1 5:5:5 出发
汽车B 2001-1-1 4:4:4 返回
汽车C 2001-1-1 6:6:6 返回
汽车D 2001-1-1 7:7:7 出发

通过一条SQL查询得到以下结果

[名称] [出发时间] [返回时间]

汽车A 2001-1-1 1:1:1 2001-1-1 2:2:2
汽车B 2001-1-1 3:3:3 2001-1-1 4:4:4
汽车C 2001-1-1 5:5:5 2001-1-1 6:6:6
汽车D 2001-1-1 7:7:7 null


多谢执教
...全文
2825 140 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
140 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
学习了
tiancailvv 2010-11-04
  • 打赏
  • 举报
回复
select a.名称,a.时间,
(select top 1 b.时间 from 表 as b where b.状态=返回 and a.名称=b.名称 and b.时间>a.时间 order by 时间 asc)
from 表 as a where a.状态=出发 order by a.名称,a.时间
luckybadboy 2010-08-23
  • 打赏
  • 举报
回复
学习。。。。。。。。
allen3010 2010-07-13
  • 打赏
  • 举报
回复
好东西……
qnini 2009-12-26
  • 打赏
  • 举报
回复
28楼正确
Huster2000 2009-12-17
  • 打赏
  • 举报
回复
表设计的就有问题!
kaizi201 2009-12-15
  • 打赏
  • 举报
回复
create table RR
(
[Name] varchar(20),
RDate datetime,
NType varchar(20)
)
insert into RR select '汽车A','2001-1-1 1:1:1','NType'
union all select '汽车A','2001-1-1 2:2:2','返回'
union all select '汽车B','2001-1-1 3:3:3','出发'
union all select '汽车C','2001-1-1 5:5:5','出发'
union all select '汽车B','2001-1-1 4:4:4','返回'
union all select '汽车C','2001-1-1 6:6:6','返回'
union all select '汽车D','2001-1-1 7:7:7','出发'
select [Name],
max(case when NType='出发' then RDate else null end) '出发时间',
max(case when NType='返回' then RDate else null end) '返回时间'
from RR group by [Name]
None465465535 2009-04-24
  • 打赏
  • 举报
回复
SELECT [名称],[出发时间],[返回时间]
FROM [Table]
WHERE [状态] = '出发'
格拉 2009-04-24
  • 打赏
  • 举报
回复
建的个表不会有个出发时间有个返回时间吗?
Jock.Chen 2009-04-24
  • 打赏
  • 举报
回复
学习
zhanghw0704 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 crw_web 的回复:]
假如查询的表名为:car

seelect a.名称,a.时间 出发时间,b.时间 返回时间 from
(select 名称,时间 from car where 状态='出发') a,
(select 名称,时间 from car where 状态='返回') b
where a.名称=b.名称
[/Quote]

支持
xmlbh 2009-04-24
  • 打赏
  • 举报
回复
得到结果是一样的:
car_name 出发 返回
汽车A 01 1 2001 08 1 2002
汽车B 03 1 2001 05 1 2001
汽车C 06 1 2001 08 1 2001
汽车D 06 1 2001 0
xmlbh 2009-04-24
  • 打赏
  • 举报
回复
可以有两种写法,一种可以写的很灵活,另一种则写死,如下表结构:
car_name date_time state
汽车A 2001-01-01 01:01:01.000 出发
汽车A 2002-08-01 01:01:00.000 返回
汽车B 2001-03-01 01:01:00.000 出发
汽车B 2001-05-01 01:01:00.000 返回
汽车C 2001-06-01 01:00:00.000 出发
汽车D 2001-06-01 01:00:00.000 出发
汽车C 2001-08-01 01:00:00.000 返回


第一种写法:,很灵活,你可以有多种state

declare @m_sql varchar(8000)
set @m_sql='select car_name '
select @m_sql=@m_sql+', max(case state when '''+a.state+''' then convert(varchar(10),date_time) else ''0'' end ) as ['+a.state+']' from (select state from car group by state) as a
set @m_sql=@m_sql+' from car group by car_name'
exec(@m_sql)

第二种写法:这就比较死板了,是固定的,但是很简单:
如下

select car_name ,
max(case state when '出发' then convert(varchar(10),date_time) else '0' end ) as [出发],
max(case state when '返回' then convert(varchar(10),date_time) else '0' end ) as [返回]
from car group by car_name
chenqink 2009-04-20
  • 打赏
  • 举报
回复

我认为上面的都不太完整,因为可能会有多次出发返回,甚至可能只有返回没有出发(分时间端统计时会遇到上段时间出发这段时间返回),所以这个查询应该分三列查,第一查名称,第二查最小出发时间,第三查最大返回时间。
select a.名称, b.出发时间, c.返回时间
from
(
select distinct 名称
from #bus
) a left outer join
(
select 名称, min(时间) 出发时间
from #bus
where 状态 = '出发'
group by 名称
) b on a.名称 = b.名称 left outer join
(
select 名称, max(时间) 返回时间
from #bus
where 状态 = '返回'
group by 名称
) c on a.名称 = c.名称
order by a.名称
chenwenyu05 2009-04-20
  • 打赏
  • 举报
回复

select A.Name, A.Time as outTime, B.inTime from dbo.Table_4 as A
left join
(select [Name], [Time] as inTime from dbo.Table_4 where [Status]='返回') as B
on A.Name = B.Name where A.Status='出发'
goodwinds 2009-04-19
  • 打赏
  • 举报
回复
究竟哪个最好呢?
ly11250054 2009-04-19
  • 打赏
  • 举报
回复
学习中.....
twinsgs 2009-04-18
  • 打赏
  • 举报
回复
学习 学习啊
ztj111 2009-04-18
  • 打赏
  • 举报
回复
declare @T table ([名称] varchar(5),[时间] datetime,[状态] varchar(4))
insert into @T
select '汽车A','2001-1-1 1:1:1','出发' union all
select '汽车A','2001-1-1 2:2:2','返回' union all
select '汽车B','2001-1-1 3:3:3','出发' union all
select '汽车C','2001-1-1 5:5:5','出发' union all
select '汽车B','2001-1-1 4:4:4','返回' union all
select '汽车C','2001-1-1 6:6:6','返回' union all
select '汽车D','2001-1-1 7:7:7','出发'

--select * from @T
--Code
select A.名称,A.时间 as 出发时间,
B.时间 as 返回时间 from @T AS A
left join
(select 名称,时间 from @T where 状态= '返回')
as B
on A.名称=B.名称
where A.状态= '出发'
ztj111 2009-04-18
  • 打赏
  • 举报
回复
2楼应该用左连接
加载更多回复(120)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧