以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助] 关于SQL 语句  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=107138)

--  作者:ncefans
--  发布时间:2017/9/21 23:06:00
--  [求助] 关于SQL 语句
不好意思,搞不定了,求助.. 对SQL实在不熟.

有两个表. 
表1) 订单表   相关列: 订单号,订单总数,订单日期
表2) 出货记录  相关列: 订单号,出货数量

两个表使用"订单号"列关联. 一个订单号对应一条到多条出货记录.

现在需要查询: 近两年之内, 订单总数和出货总数(出货数量之和)不一致的记录.

select 订单号,sum(出货数量) as 出货总数 f rom {出货记录} where 订单号 in 
(
select 订单号 f rom {订单表 }WHERE DateDiff(m, 订单日期, GetDate()) <24
)
group by 订单号

到这一步,只是统计了两年内的订单,出货总数. 请问如何再连接订单表并把订单总数和出货总数(出货数量之和)不一致的记录从订单表中取出来? 谢谢!

统计日期以订单表的订单日期为准...不管出货日期.

[此贴子已经被作者于2017/9/21 23:07:15编辑过]

--  作者:有点甜
--  发布时间:2017/9/21 23:43:00
--  

语句1:select 订单号, sum(出货数量) as 出货总数 from 出货记录 group by 订单号

 

语句2:select 订单号, sum(订单总数) as 订单总数 from 订单表 WHERE DateDiff(m, 订单日期, GetDate()) <24 group by 订单号

 

语句3:select * from (语句2) as a left join (语句1) as b on a.订单号=b.订单号 where a.订单总数 <> b.出货总数


--  作者:ncefans
--  发布时间:2017/9/22 9:46:00
--  
谢大神回复,原来生成的表可以用别名再这样引用联接。 问一下,像语句1这样把所有行都计算了,如果记录很多,这样会不会有效率问题?
[此贴子已经被作者于2017/9/22 9:46:39编辑过]

--  作者:有点甜
--  发布时间:2017/9/22 10:14:00
--  
2楼这样写代码,比你用 in 的效率高很多。不要怀疑sqlserver处理连接查询的能力。
--  作者:ncefans
--  发布时间:2017/9/22 11:07:00
--  
好的,收到