这个SQL语句为何总报错?

heikeyanxi 2010-11-13 04:31:00

select a.*, b.* from
(select top 1 车辆牌照, 汽油类型 , 加油站 from 加汽油表) a
left join
(
select isnull(sum(结余), 0) from 汽油月结余表 c where c.车辆牌照=a.车辆牌照 and c.加油站=a.加油站 and c.油气类型=a.汽油类型 + SUM(a.购油量) - sum(a.用油量)
from 加汽油表 b where b.id <= a.id
)
on a.车辆牌照=b.车辆牌照 and a.汽油类型=b.油气类型 and a.加油站=b.加油站 and 时间 between '2010-11-1' and '2010-11-20'

错误内容:
服务器: 消息 156,级别 15,状态 1
在关键字 'from' 附近有语法错误。

哪里写错了?
...全文
212 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2010-11-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 claro 的回复:]

引用楼主 heikeyanxi 的回复:
哪里写错了?
逻辑错。
[/Quote]
确实是逻辑混乱,根本就没搞清楚left join....
claro 2010-11-13
  • 打赏
  • 举报
回复
如果要where 时间,需要先在结果集中定义出。
claro 2010-11-13
  • 打赏
  • 举报
回复
最好贴出数据和希望结果。

以下纯猜:
select a.*, b.*,c.*
from
(
select top 1 车辆牌照, 汽油类型 , 加油站 from 加汽油表
) a
left join
(
select 车辆牌照, 汽油类型 , 加油站,isnull(sum(结余), 0)
from 汽油月结余表 c
group by 车辆牌照, 汽油类型 , 加油站
) c
on c.车辆牌照=a.车辆牌照 and c.加油站=a.加油站 and c.油气类型=a.汽油类型
join
(
select 车辆牌照, 汽油类型 , 加油站,SUM(a.购油量) - sum(a.用油量)
from 加汽油表
group by group by 车辆牌照, 汽油类型 , 加油站
) b
on a.车辆牌照=b.车辆牌照 and a.汽油类型=b.油气类型 and a.加油站=b.加油站 and b.id <= a.id
where XXXX.时间 between '2010-11-1' and '2010-11-20' --那个表的时间???

claro 2010-11-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 heikeyanxi 的回复:]
哪里写错了?
[/Quote]逻辑错。

彻底被您打呗了。

heikeyanxi 2010-11-13
  • 打赏
  • 举报
回复
修改后的SQL, 还是报错 - -!

select a.*, b.* from
(select top 1 车辆牌照, 加油类型 , 供货商 from 加油加气表) a
left join
(
select isnull(sum(结余), 0) from 油气月结余表 c where c.车辆牌照=a.车辆牌照 and c.供货商=a.供货商 and c.油气类型=a.加油类型 + SUM(购油量) - sum(用油量)
from 加油加气表 where id <= a.id and 车辆牌照=b.车辆牌照 and 加油类型=b.油气类型 and 供货商=b.供货商 and 时间 between '2010-11-1' and '2010-11-20'
) b
on a.车辆牌照=b.车辆牌照 and a.加油类型=b.油气类型 and a.供货商=b.供货商 and a.时间 between '2010-11-1' and '2010-11-20'

heikeyanxi 2010-11-13
  • 打赏
  • 举报
回复
回楼上几位朋友,还是报那个错
mybossmyway 2010-11-13
  • 打赏
  • 举报
回复
left join
(
select isnull(sum(结余), 0) from 汽油月结余表 c where c.车辆牌照=a.车辆牌照 and c.加油站=a.加油站 and c.油气类型=a.汽油类型 + SUM(a.购油量) - sum(a.用油量)
from 加汽油表 b where b.id <= a.id
) c,道理跟a一样,要给他起个名字,而不是用b当做左连接的表名
「已注销」 2010-11-13
  • 打赏
  • 举报
回复
select a.*, b.* from
(select top 1 车辆牌照, 汽油类型 , 加油站 from 加汽油表) a
left join
(
select isnull(sum(结余), 0) from 汽油月结余表 c where c.车辆牌照=a.车辆牌照 and c.加油站=a.加油站 and c.油气类型=a.汽油类型 + SUM(a.购油量) - sum(a.用油量)
from 加汽油表 b where b.id <= a.id
) b---按你的逻辑加上表名b
on a.车辆牌照=b.车辆牌照 and a.汽油类型=b.油气类型 and a.加油站=b.加油站 and 时间 between '2010-11-1' and '2010-11-20'
====
再看看是否报错?
「已注销」 2010-11-13
  • 打赏
  • 举报
回复
看了下,那个表笔名应该为b吧
「已注销」 2010-11-13
  • 打赏
  • 举报
回复
select a.*, b.* from
(select top 1 车辆牌照, 汽油类型 , 加油站 from 加汽油表) a
left join
(
select isnull(sum(结余), 0) from 汽油月结余表 c where c.车辆牌照=a.车辆牌照 and c.加油站=a.加油站 and c.油气类型=a.汽油类型 + SUM(a.购油量) - sum(a.用油量)
from 加汽油表 b where b.id <= a.id
)P---加上表名
on a.车辆牌照=b.车辆牌照 and a.汽油类型=b.油气类型 and a.加油站=b.加油站 and 时间 between '2010-11-1' and '2010-11-20'
====
下面的On连接部分也需要根据表名做相应变更

heikeyanxi 2010-11-13
  • 打赏
  • 举报
回复
我要统计出每个车每个汽油型号在每个加油站在某一段时间里的结余量,汽油月结余表 其实是个数据初始化表,结余量=初始数据+购油量-用油量

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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