导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

求救较复杂的SQL语句!!在线等 ,很急啊!!!!

恋风的鸟 2003-12-23 09:12:42
分类 品名 上月结存 本月入库 本月领用 本月结存
数量 金额 数量 金额 数量 金额 数量 金 额
为了实现如上的表结构,实现的结果是如果这个月没有本月入库,那本月入库的数量和金额就用0来代替,其他情况也如此,小弟下面的语句只实现了每个字段都产生过才可以,也就是如果这个月没有本月入库,那这条记录就不会显示出来了,其他情况也如此,不知道该怎么修改,各位帮帮忙,很急很急,在线等


CREATE TABLE test(分类 char(20),品名 char(20),数量1 float,金额1 money,
数量2 float,金额2 money,数量3 float,金额3 money,数量4 float,金额4 money)
INSERT INTO test(分类,品名,数量1,金额1,数量2,金额2,数量3,金额3,数量4,金额4)
SELECT A1.型号,A1.材料名称,A1.本月前入库总数量-B1.本月前领用总数量+C1.本月前退料总数量
AS 上月结存数量,A1.本月前入库总数量-B1.本月前领用总金额+C1.本月前退料总金额 AS 上月结存金额,
A2.本月入库数量,A2.本月入库金额,B2.本月领用数量,B2.本月领用金额,
A1.本月前入库总数量-B1.本月前领用总数量+C1.本月前退料总数量+A2.本月入库数量-B2.本月领用数量+C2.本月退料数量 AS 本月结存数量,
A1.本月前入库总金额-B1.本月前领用总金额+C1.本月前退料总金额+A2.本月入库金额-B2.本月领用金额+C2.本月退料金额 AS 本月结存金额
FROM (SELECT 型号,材料名称,SUM(合格数量) AS 本月前入库总数量,SUM(金额) AS 本月前入库总金额
FROM inwarehousedetail WHERE 入库单号 IN (SELECT 入库单号 FROM inwarehouse WHERE 入库确认标志='确认'
AND 入库日期<'2003-12-1') GROUP BY 型号,材料名称) AS A1,
(SELECT 型号,材料名称,SUM(合格数量) AS 本月入库数量,SUM(金额) AS 本月入库金额
FROM inwarehousedetail WHERE 入库单号 IN (SELECT 入库单号 FROM inwarehouse WHERE 入库确认标志='确认'
AND 入库日期>='2003-12-1' AND 入库日期<'2004-1-1') GROUP BY 型号,材料名称) AS A2,
(SELECT 型号,品名,SUM(数量) AS 本月前领用总数量,SUM(金额) AS 本月前领用总金额
FROM receivestuffdetail WHERE 领料单号 IN (SELECT 领料单号 FROM receivestuff WHERE 领料确认标志='确认'
AND 领料时间<'2003-12-1') AND 领料仓库='原材料仓库' GROUP BY 型号,品名) AS B1,
(SELECT 型号,品名,SUM(数量) AS 本月领用数量,SUM(金额) AS 本月领用金额
FROM receivestuffdetail WHERE 领料单号 IN (SELECT 领料单号 FROM receivestuff WHERE 领料确认标志='确认'
AND 领料时间>='2003-12-1' AND 领料时间<'2004-1-1') AND 领料仓库='原材料仓库' GROUP BY 型号,品名) AS B2,
(SELECT 型号,品名,SUM(数量) AS 本月前退料总数量,SUM(金额) AS 本月前退料总金额
FROM backstuffdetail WHERE 退料单号 IN (SELECT 退料单号 FROM backstuff WHERE 退料确认标志='确认'
AND 退料时间<'2003-12-1') AND 退料仓库='原材料仓库' GROUP BY 型号,品名) AS C1,
(SELECT 型号,品名,SUM(数量) AS 本月退料数量,SUM(金额) AS 本月退料金额
FROM backstuffdetail WHERE 退料单号 IN (SELECT 退料单号 FROM backstuff WHERE 退料确认标志='确认'
AND 退料时间>='2003-12-1' AND 退料时间<'2004-1-1') AND 退料仓库='原材料仓库' GROUP BY 型号,品名) AS C2
WHERE A1.型号=A2.型号 AND B1.型号=B2.型号 AND C1.型号=C2.型号 AND A1.型号=B1.型号
AND B1.型号=C1.型号 AND A1.材料名称=A2.材料名称 AND B1.品名=B2.品名
AND C1.品名=C2.品名 AND A1.材料名称=B1.品名 AND B1.品名=C1.品名
GROUP BY A1.型号,A1.材料名称,A1.本月前入库总数量,A1.本月前入库总金额,A2.本月入库数量,A2.本月入库金额,
B1.本月前领用总数量,B1.本月前领用总金额,B2.本月领用数量,B2.本月领用金额,C1.本月前退料总数量,
C1.本月前退料总金额,C2.本月退料数量,C2.本月退料金额
...全文
21 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
恋风的鸟 2003-12-23
谢谢大家,搞定了,再加了个distinct和几个all就行了,谢谢!!!
回复
恋风的鸟 2003-12-23
是不是在我的AS A1后面连接呢???
回复
dlpseeyou 2003-12-23
用full joij 连接
然后 isNull(SUM(数量),0)
回复
恋风的鸟 2003-12-23
还是不行啊,大哥!!!
回复
gmlxf 2003-12-23
用left join 连接。
然后 isNull(SUM(数量),0)
回复
gmlxf 2003-12-23
同意中海,他理解你的意思了。
回复
gmlxf 2003-12-23
如果在这个表中一条记录也找不到,我想把SUM(数量)作为0来进行后面的计算?
--
如果没有记录,那么后面的表连接条件就不符合,就不存在sum了啊。

回复
victorycyz 2003-12-23
只实现了每个字段都产生过才可以,也就是如果这个月没有本月入库,那这条记录就不会显示出来了.
--------------------------------------------------------------------------------
你写得太多,我看着累,只告诉你这个问题的解决方法:

select a.分类,a.品名, sum(...) as 上月结存数量, ...
from 物品基本表 a left join 入库表 b on a.品名=b.品名 ----关键是用left join连
left join 出库表 c on a.品名=b.品名
group by a.分类,a.品名
回复
gmlxf 2003-12-23
SUM(isNull(数量,0) )
回复
恋风的鸟 2003-12-23
其实上面的最后的语句都差不多的,你看一,二个就知道个大概了
回复
恋风的鸟 2003-12-23
SELECT 型号,品名,SUM(数量) AS 本月领用数量,SUM(金额) AS 本月领用金额
FROM receivestuffdetail WHERE 领料单号 IN (SELECT 领料单号 FROM receivestuff WHERE 领料确认标志='确认'
AND 领料时间>='2003-12-1' AND 领料时间<'2004-1-1') AND 领料仓库='原材料仓库' GROUP BY 型号,品名

如果在这个表中一条记录也找不到,我想把SUM(数量)作为0来进行后面的计算,用到这个SUM(数量)来计算的也是在一个SELECT语句里面,因为很烦,所以其他的就不写出来了,而且想在最后显示出来的时候也为0。可能这样说差不多,楼上的帮帮忙
回复
gmlxf 2003-12-23
楼主可以将你的问题简化一下吗?这样会很累的。
如果简化一下你的问题应该会快点解决的。
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告