关于多表查询问题,这个问题困扰我好长时间了.

gaosonglove 2010-02-02 11:50:27
现在请教一个问题,是关于查询的,现在有两个表,stationinfo,里面存放的是台站信息,还有另一个表是jw_daycount,存放的是每天24小时每小时的统计数据,这两张表里存放的记录分别如下:
stationinfo表:
   jwstation jwnumber
北京        X3510064
   天津        X3120068
   郑州        X3020023
   上海        X3012005
jw_daycount表:
    
jwstation jwnumber      jwdatetime   jwcount
北京        X3510064 2010-01-28 00 60
   天津        X3120068 2010-01-28 00 52
   上海        X3012005 2010-01-28 00 72
北京        X3510064 2010-01-28 01 60
   天津        X3120068 2010-01-28 01 52
   上海        X3012005 2010-01-28 01 72
...
...
北京        X3510064 2010-02-01 23 60
   天津        X3120068 2010-02-01 23 52
   上海        X3012005 2010-02-01 23 72
   郑州        X3020023  2010-02-01 23  72

在jw_daycount表中,存放的是5天的数据,从1月28号到2月1号,在有的时间段内没有郑州这个地方数据,有的时间段内有郑州的数据,其他北京,上海,天津都有数据,怎样根据station_info表来查询每个小时没有郑州这个地方没有数据呢?谢谢,请教高手
...全文
242 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
老黎 2010-04-03
  • 打赏
  • 举报
回复
楼主该结贴了....
  • 打赏
  • 举报
回复
还没有解决吗?
使用一个每小时都有数据的左关联第二个表,就出来了。
yyyyyhhhhwwww 2010-02-12
  • 打赏
  • 举报
回复
#14 思路相当不错。
Sweet-Tang 2010-02-11
  • 打赏
  • 举报
回复

create table stationinfo
(
jwstation varchar(20),
jwnumber varchar(20)
)

insert into stationinfo
select '北京','x3510064'
union
select '天津','x3120068'
union
select '郑州','x3020023'
union
select '上海','x3012005'

create table jw_daycount
(jwstation varchar(20),
jwnumber varchar(20),
jwdatetime datetime,
jwcount int
)

insert into jw_daycount
select '北京','x3510064','2010-01-28 00:00:00',60
union
select '天津','x3120068','2010-01-28 00:00:00',52
union
select '上海','x3012005','2010-01-28 00:00:00',72
union
select '北京','x3510064','2010-01-28 01:00:00',60
union
select '天津','x3120068','2010-01-28 01:00:00',52
union
select '上海','x3012005','2010-01-28 01:00:00',72
union
select '北京','x3510064','2010-02-01 23:00:00',60
union
select '天津','x3120068','2010-02-01 23:00:00',52
union
select '上海','x3012005','2010-02-01 23:00:00',72
union
select '郑州','x3020023','2010-01-01 23:00:00',72


declare @startdate datetime,@enddate datetime,@i int,@j int
declare @temptable table(jwstation varchar(20),jwnumber varchar(20),jwdatetime datetime)
select @startdate='2010-01-28',@enddate='2010-02-01'
select @i=0,@j=DATEDIFF(day,@startdate,@enddate)
while(@i<=@j)
begin
insert into @temptable
select jwstation,jwnumber,DATEADD(day,@i,@startdate) from stationinfo
set @i=@i+1
end

declare @jwdaycount table (jwnumber varchar(20),jwdatetime datetime,jwcount int)
insert into @jwdaycount(jwnumber,jwdatetime,jwcount)
select jwnumber,CONVERT(varchar(10),jwdatetime,120),SUM(jwcount) from jw_daycount group by jwnumber,CONVERT(varchar(10),jwdatetime,120)

select temptable.jwstation,temptable.jwnumber,temptable.jwdatetime,isnull(jwdaycount.jwcount,0)jwcount
from @temptable temptable
left join @jwdaycount jwdaycount on jwdaycount.jwnumber=temptable.jwnumber and jwdaycount.jwdatetime=temptable.jwdatetime
order by temptable.jwdatetime,temptable.jwnumber



jwstation jwnumber jwdatetime jwcount
上海 x3012005 2010-01-28 144
郑州 x3020023 2010-01-28 0
天津 x3120068 2010-01-28 104
北京 x3510064 2010-01-28 120
上海 x3012005 2010-01-29 0
郑州 x3020023 2010-01-29 0
天津 x3120068 2010-01-29 0
北京 x3510064 2010-01-29 0
上海 x3012005 2010-01-30 0
郑州 x3020023 2010-01-30 0
天津 x3120068 2010-01-30 0
北京 x3510064 2010-01-30 0
上海 x3012005 2010-01-31 0
郑州 x3020023 2010-01-31 0
天津 x3120068 2010-01-31 0
北京 x3510064 2010-01-31 0
上海 x3012005 2010-02-01 72
郑州 x3020023 2010-02-01 0
天津 x3120068 2010-02-01 52
北京 x3510064 2010-02-01 60
  • 打赏
  • 举报
回复
你到现在还没有说明白你的问题。
把你想要实现的结果写出来。
lg314 2010-02-11
  • 打赏
  • 举报
回复
先建立做一个基本表
create table all_jwnumber_jwdatetime(jwnumber varchar(30),jwdatetime date,ihour int)

包含所有站点所有时段的信息,以后查询的时候链接这个表的话很容易看出来那个时段没有了,这个是最快的

方法,如果要动态的查询哪个日期少了的话速度会非常慢的
老黎 2010-02-11
  • 打赏
  • 举报
回复
引用 13 楼 kerafan 的回复:
引用楼主 gaosonglove 的回复:现在请教一个问题,是关于查询的,现在有两个表,stationinfo,里面存放的是台站信息,还有另一个表是jw_daycount,存放的是每天24小时每小时的统计数据,这两张表里存放的记录分别如下: stationinfo表:   jwstation          jwnumber       北京        X3510064   天津        X3120068   郑州        X3020023   上海        X3012005 jw_daycount表:           jwstation          jwnumber      jwdatetime   jwcount       北京        X3510064    2010-01-28 00    60    天津        X3120068    2010-01-28 00    52    上海        X3012005    2010-01-28 00    72       北京        X3510064    2010-01-28 01    60    天津        X3120068    2010-01-28 01    52    上海        X3012005    2010-01-28 01    72       ...       ...       北京         X3510064    2010-02-01 23    60    天津        X3120068    2010-02-01 23    52    上海        X3012005    2010-02-01 23    72    郑州        X3020023  2010-02-01 23     72 在jw_daycount表中,存放的是5天的数据,从1月28号到2月1号,在有的时间段内没有郑州这个地方数据,有的时间段内有郑州的数据,其他北京,上海,天津都有数据,怎样根据station_info表来查询每个小时没有郑州这个地方没有数据呢?谢谢,请教高手
--假如楼主你可以确定只有郑州才会没有数据的话,我有个方法
--假如楼主你的jwdatetime的数据类型是时间格式可以这样写
select convert(char(13),jwdatetime,120) as 时间点,count(jwstation) as 站点数
from jw_daycount
group by convert(char(13),jwdatetime,120)

--这样出来的结果就会像这样
2010-01-28 00 | 4  --四个站点有数据
2010-01-28 01 | 4  --四个站点有数据
2010-01-28 02 | 3  --三个站点有数据
2010-01-28 03 | 3  --三个站点有数据


--把上面的语句的结果作为子查询然后查询,请看:
select 时间点
from (
      select convert(char(13),jwdatetime,120) as 时间点,count(jwstation) as 站点数
      from jw_daycount
      group by convert(char(13),jwdatetime,120)
    ) a
where 站点数 < 4

--这样就得到了没有郑州数据的时间点了


重新排版一下,顺便加多个jwdatetime为字符串的做法

--假如楼主你可以确定只有郑州才会没有数据的话,我有个方法
--假如楼主你的jwdatetime的数据类型是时间格式可以这样写
select convert(char(13),jwdatetime,120) as 时间点,count(jwstation) as 站点数
from jw_daycount
group by convert(char(13),jwdatetime,120)

--这样出来的结果就会像这样
2010-01-28 00 | 4 --四个站点有数据
2010-01-28 01 | 4 --四个站点有数据
2010-01-28 02 | 3 --三个站点有数据
2010-01-28 03 | 3 --三个站点有数据


--假如楼主你的jwdatetime的数据类型是字符串的话可以这样写
--字符串格式是:'2010-01-28 12'
select jwdatetime 时间点,count(jwstation) as 站点数
from jw_daycount
group by jwdatetime


--把上面的语句的结果作为子查询然后查询,请看:
select 时间点
from (
select convert(char(13),jwdatetime,120) as 时间点,count(jwstation) as 站点数
from jw_daycount
group by convert(char(13),jwdatetime,120)
) a
where 站点数 < 4

--这样就得到了没有郑州数据的时间点了
老黎 2010-02-11
  • 打赏
  • 举报
回复
引用楼主 gaosonglove 的回复:
现在请教一个问题,是关于查询的,现在有两个表,stationinfo,里面存放的是台站信息,还有另一个表是jw_daycount,存放的是每天24小时每小时的统计数据,这两张表里存放的记录分别如下:
stationinfo表:
   jwstation          jwnumber
      北京        X3510064
   天津        X3120068
   郑州        X3020023
   上海        X3012005
jw_daycount表:
    
      jwstation          jwnumber      jwdatetime   jwcount
      北京        X3510064    2010-01-28 00    60
   天津        X3120068    2010-01-28 00    52
   上海        X3012005    2010-01-28 00    72
      北京        X3510064    2010-01-28 01    60
   天津        X3120068    2010-01-28 01    52
   上海        X3012005    2010-01-28 01    72
      ...
      ...
      北京         X3510064    2010-02-01 23    60
   天津        X3120068    2010-02-01 23    52
   上海        X3012005    2010-02-01 23    72
   郑州        X3020023  2010-02-01 23     72

在jw_daycount表中,存放的是5天的数据,从1月28号到2月1号,在有的时间段内没有郑州这个地方数据,有的时间段内有郑州的数据,其他北京,上海,天津都有数据,怎样根据station_info表来查询每个小时没有郑州这个地方没有数据呢?谢谢,请教高手

--假如楼主你可以确定只有郑州才会没有数据的话,我有个方法
--假如楼主你的jwdatetime的数据类型是时间格式可以这样写
select convert(char(13),jwdatetime,120) as 时间点,count(jwstation) as 站点数
from jw_daycount
group by convert(char(13),jwdatetime,120)

--这样出来的结果就会像这样
2010-01-28 00 | 4 --四个站点有数据
2010-01-28 01 | 4 --四个站点有数据
2010-01-28 02 | 3 --三个站点有数据
2010-01-28 03 | 3 --三个站点有数据


--把上面的语句的结果作为子查询然后查询,请看:
select 时间点
from (
select convert(char(13),jwdatetime,120) as 时间点,count(jwstation) as 站点数
from jw_daycount
group by convert(char(13),jwdatetime,120)
) a
where 站点数 < 4

--这样就得到了没有郑州数据的时间点了
老黎 2010-02-11
  • 打赏
  • 举报
回复
mark


早上起来想
tys101582 2010-02-03
  • 打赏
  • 举报
回复
不懂
gaosonglove 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liangck 的回复:]
每个小时没有郑州这个地方没有数据呢?
-----
什么东西?
[/Quote]
不好意思,怪 我没表达清楚。每个小时郑州这个地方的数据没有的话,则显示出其郑州地方名以及设备ID.
liangCK 2010-02-02
  • 打赏
  • 举报
回复
每个小时没有郑州这个地方没有数据呢?
-----
什么东西?
gaosonglove 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 netajax1 的回复:]
引用 1 楼 fredrickhu 的回复:
发了好多遍啊

跟着跑来...
[/Quote]
我现在发的跟以前发的不一样。请别见笑
以前有个算法,运行很慢,查询大量数据需要10分钟,现在需要进行改进一下.10秒之内查询所需要的数据.
gaosonglove 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
发了好多遍啊
[/Quote]
大哥,只怪我当初表达不清,早上以为到那步问题解决了其他都好说,没想到思考一上午也没弄出来。这个项目急啊,谁要帮我解决了,给他高分。
netajax1 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]
发了好多遍啊
[/Quote]
跟着跑来...
--小F-- 2010-02-02
  • 打赏
  • 举报
回复
发了好多遍啊
starseeker7 2010-02-02
  • 打赏
  • 举报
回复
你還是貼一個
希望運行后出現的結果吧

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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