你的B表和C表有什么关系吗?D表是按哪些字段分组? 对B表分组之后SUM数量就应可以得到D的结果,借助类型用DECODE函数处理数量,DECODE(类型,‘R’,数量,'C',-1*数量)。SELECT 分组字段,SUM(DECODE(类型,‘R’,数量,'C',-1*数量)) FROM B 表 GROUP BY 分组字段SQL SERVER中有和DECODE函数类似的IIF。
有 DECODE吗??! Select 单位代码, 物品代码, 批次, Sum(数量) as 出库数量-入库数量 From ( Select 单位代码, 物品代码, 批次, case 类型 when 'R' then 数量 when 'C' then 0-数量 end as 数量 From B union all Select 单位代码, 物品代码, 批次, case 类型 when 'R' then 数量 when 'C' then 0-数量 end as 数量 From C ) as F Group By 单位代码, 物品代码, 批次这个语句试试吧~~~~~
B表和C表有什么区别吗? decode在oracle中是存在的
Select 单位代码, 物品代码, 批次, Sum(数量) as 出库数量-入库数量 From ( Select 单位代码, 物品代码, 批次, case 类型 when 'R' then 数量 when 'C' then 0-数量 end as 数量 From B union all Select 单位代码, 物品代码, 批次, case 类型 when 'R' then 数量 when 'C' then 0-数量 end as 数量 From C ) as F Group By 单位代码, 物品代码, 批次
实现:用一句SQL语句实现应当有两种方法: 1 类似的 case ... when ... then ... when ... then .. else ... end 但是扩展性不好,如果增加一种入库或者入库类型则需要修改程序. 2 增加一个表类似于 出入库类型 数据方向 出库 -1 入库 1 盘盈 1 ..... 然后多连接一个表,反正这个表不会太大.但是:你写的程序是否考虑过效率?出库和入库流水表的数量级是多少?如果很大,那末就等着三个月后重写程序吧. 建议用最简单的方法:建议个临时表用于相关的查询和计算
谢谢大家的帮忙,我早上写了一条语句,大概跟大家的思路差不多。现在有个问题就是,因为在我的A表中物品代码是可以重复的,现在我只需要的不重复的物品代码,然后根据单位代码,批次,物品代码去查B,C中相应的关于这个批次的物品代码的出入库纪录,B表是当前的库存操作纪录,C表是历史库存 操作纪录。干脆我把我的语句贴出来,大家看看吧 SELECT 单位代码,批次,物品代码,SUM(数量) AS 数量 FROM ( select A.单位代码,A.批次,A.物品代码, (CASE WHEN B.类型='C' THEN B.数量 WHEN B.类型='R' THEN -B.数量 END) 数量 from A LEFT OUTER JOIN B ON B.单位代码=A.单位代码 AND B.物品代码=A.物品代码 AND A.批次=A.批次 where A.单位代码='11' AND A.批次='1' UNION ALL select A.单位代码,A.批次,A.物品代码, (CASE WHEN B.类型='C' THEN C.数量 WHEN B.类型='R' THEN -C.数量 END) 数量 from A LEFT OUTER JOIN C ON C.单位代码=A.单位代码 AND C.物品代码=A.物品代码 AND C.批次=A.批次 where A.单位代码='11' AND A.批次='1' ) GROUP BY 单位代码,批次,物品代码 因为A中有的物品代码在B,C中不一定有,所以我用了LEFT OUTER JOIN,但现在是因为A中的物品有重复的,搞得我JOIN出来的纪录有重复,我想用DISTINCT,但似乎不起作用。大家有空看看吧,谢谢了。
SELECT 单位代码,批次,物品代码,SUM(数量) AS 数量 FROM ( select A.单位代码,A.批次,A.物品代码, (CASE WHEN B.类型='C' THEN B.数量 WHEN B.类型='R' THEN -B.数量 END) 数量 from A LEFT OUTER JOIN B ON B.单位代码=A.单位代码 AND B.物品代码=A.物品代码 AND B.批次=A.批次 //刚才这里错了,现在改过来了 where A.单位代码='11' AND A.批次='1' UNION ALL select A.单位代码,A.批次,A.物品代码, (CASE WHEN B.类型='C' THEN C.数量 WHEN B.类型='R' THEN -C.数量 END) 数量 from A LEFT OUTER JOIN C ON C.单位代码=A.单位代码 AND C.物品代码=A.物品代码 AND C.批次=A.批次 where A.单位代码='11' AND A.批次='1' ) GROUP BY 单位代码,批次,物品代码不好意思了,这几天人比较累。出了点小问题。
对B表分组之后SUM数量就应可以得到D的结果,借助类型用DECODE函数处理数量,DECODE(类型,‘R’,数量,'C',-1*数量)。SELECT 分组字段,SUM(DECODE(类型,‘R’,数量,'C',-1*数量)) FROM B 表 GROUP BY 分组字段SQL SERVER中有和DECODE函数类似的IIF。
有 DECODE吗??!
Select 单位代码, 物品代码, 批次, Sum(数量) as 出库数量-入库数量
From (
Select 单位代码, 物品代码, 批次, case 类型 when 'R' then 数量 when 'C' then 0-数量 end as 数量
From B
union all
Select 单位代码, 物品代码, 批次, case 类型 when 'R' then 数量 when 'C' then 0-数量 end as 数量
From C
) as F
Group By 单位代码, 物品代码, 批次这个语句试试吧~~~~~
decode在oracle中是存在的
From (
Select 单位代码, 物品代码, 批次, case 类型 when 'R' then 数量 when 'C' then 0-数量 end as 数量
From B
union all
Select 单位代码, 物品代码, 批次, case 类型 when 'R' then 数量 when 'C' then 0-数量 end as 数量
From C
) as F
Group By 单位代码, 物品代码, 批次
1 类似的 case ... when ... then ... when ... then .. else ... end 但是扩展性不好,如果增加一种入库或者入库类型则需要修改程序.
2 增加一个表类似于
出入库类型 数据方向
出库 -1
入库 1
盘盈 1
.....
然后多连接一个表,反正这个表不会太大.但是:你写的程序是否考虑过效率?出库和入库流水表的数量级是多少?如果很大,那末就等着三个月后重写程序吧. 建议用最简单的方法:建议个临时表用于相关的查询和计算
操作纪录。干脆我把我的语句贴出来,大家看看吧
SELECT 单位代码,批次,物品代码,SUM(数量) AS 数量
FROM
(
select A.单位代码,A.批次,A.物品代码,
(CASE WHEN B.类型='C' THEN B.数量
WHEN B.类型='R' THEN -B.数量 END) 数量
from A
LEFT OUTER JOIN B
ON B.单位代码=A.单位代码
AND B.物品代码=A.物品代码
AND A.批次=A.批次
where A.单位代码='11'
AND A.批次='1'
UNION ALL
select A.单位代码,A.批次,A.物品代码,
(CASE WHEN B.类型='C' THEN C.数量
WHEN B.类型='R' THEN -C.数量 END) 数量
from A
LEFT OUTER JOIN C
ON C.单位代码=A.单位代码
AND C.物品代码=A.物品代码
AND C.批次=A.批次
where A.单位代码='11'
AND A.批次='1'
)
GROUP BY 单位代码,批次,物品代码
因为A中有的物品代码在B,C中不一定有,所以我用了LEFT OUTER JOIN,但现在是因为A中的物品有重复的,搞得我JOIN出来的纪录有重复,我想用DISTINCT,但似乎不起作用。大家有空看看吧,谢谢了。
FROM
(
select A.单位代码,A.批次,A.物品代码,
(CASE WHEN B.类型='C' THEN B.数量
WHEN B.类型='R' THEN -B.数量 END) 数量
from A
LEFT OUTER JOIN B
ON B.单位代码=A.单位代码
AND B.物品代码=A.物品代码
AND B.批次=A.批次 //刚才这里错了,现在改过来了
where A.单位代码='11'
AND A.批次='1'
UNION ALL
select A.单位代码,A.批次,A.物品代码,
(CASE WHEN B.类型='C' THEN C.数量
WHEN B.类型='R' THEN -C.数量 END) 数量
from A
LEFT OUTER JOIN C
ON C.单位代码=A.单位代码
AND C.物品代码=A.物品代码
AND C.批次=A.批次
where A.单位代码='11'
AND A.批次='1'
)
GROUP BY 单位代码,批次,物品代码不好意思了,这几天人比较累。出了点小问题。