日期:2014-05-19  浏览次数:20488 次

连接两个数据表后的分组汇总问题
请大虾看看“结存减包装出库”数据为何不对:

SELECT   s.代码,   s.简化名称,
              SUM(s.入库-s.出库)   AS   结存
FROM   VScdj   s
WHERE   s.代码= '1304-0200-03-0100 '
GROUP   BY   s.代码,   s.简化名称


SELECT   c.代码,   m.简化名称,
              SUM(c.出库)   AS   包装出库
FROM   成品出入库单   c   LEFT   JOIN   材料代码   m   ON   (c.代码=m.代码)
WHERE   c.工序= '包装 '   AND   c.代码= '1304-0200-03-0100 '
GROUP   BY   c.代码,   m.简化名称


SELECT   s.代码,   s.简化名称,
              SUM(s.入库-s.出库)-SUM(c.出库)   AS   结存减包装出库
FROM   VScdj   s   INNER   JOIN   成品出入库单   c   ON   (c.代码=s.代码   AND   c.工序= '包装 ')
WHERE   s.代码= '1304-0200-03-0100 '
GROUP   BY   s.代码,   s.简化名称


(所影响的行数为   1   行)

代码 简化名称 结存
--------------------------
1304-0200-03-0100                     AgNi(10)-ASE-W         5058.850


(所影响的行数为   1   行)

代码 简化名称 包装出库
--------------------------
1304-0200-03-0100                     AgNi(10)-ASE-W         8419.072

(所影响的行数为   1   行)

代码 简化名称 结存减包装出库
--------------------------
1304-0200-03-0100                     AgNi(10)-ASE-W         -5282775.106


------解决方案--------------------
select s.代码, s.简化名称, sum(s.入库-s.出库) - sum(c.出库) as 结存减包装出库
from VScdj s inner join 成品出入库单 c on s.代码 = c.代码
inner join 材料代码 m on c.代码 = m.代码
where s.代码= '1304-0200-03-0100 ' and c.工序= '包装 '
group by s.代码, s.简化名称

這樣應該行吧
------解决方案--------------------
--看看這兩個例子,你就容易理解了。

--這個沒有問題,出現的是兩條數據
Select A.* From
(Select 1 As ID) A
Inner Join
(Select 1 As ID
Union All
Select 1
Union All
Select 2) B
On A.Id = B.ID


--但是B中如果也有兩條ID為1的,結果就出現重復了
Select A.* From
(Select 1 As ID
Union All
Select 1) A
Inner Join
(Select 1 As ID
Union All
Select 1
Union All
Select 2) B
On A.Id = B.ID