首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减法运算返回错误结果

减法运算返回错误结果
EN

Stack Overflow用户
提问于 2014-06-18 08:58:09
回答 2查看 567关注 0票数 1
代码语言:javascript
复制
SELECT 
    TOB.SchoolID,
    SUM (TOB.Rice)- SUM(TDMD.Rice)
FROM  tblOpeningBalance TOB 
JOIN  tblDailyMidDayDetails TDMD 
    ON TOB.SchoolID = TDMD.SchoolID
WHERE  TOB.Date<=CONVERT(datetime,'19/06/2014',103) 
GROUP BY TOB.SchoolID;

这是我得到错误结果的查询。

要获得我想要单独减去的值,查询是..。

代码语言:javascript
复制
SELECT 
    DISTINCT SchoolID, 
    SUM (Rice) AS Rice
FROM  tblOpeningBalance 
WHERE  Date <= CONVERT(datetime,'19/06/2014',103) 
GROUP BY SchoolID;

第二个查询:

代码语言:javascript
复制
SELECT 
    SchoolID,
    SUM(Rice) AS Rice 
FROM tblDailyMidDayDetails 
WHERE Date<=CONVERT(datetime,'19/06/2014',103)
GROUP BY SchoolID;

这两个查询返回真正的结果,但是当试图通过加入获得减去的结果时,我得到了错误的值。

可能是我做错了错误的观念。

请指引我!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-18 09:03:46

只需将现有查询(DISTINCT除外)保留为子查询:

代码语言:javascript
复制
SELECT ob.SchoolID,
       ob.Rice - dmdd.Rice
FROM (
  Select SchoolID, 
  SUM (Rice) AS Rice
  FROM tblOpeningBalance 
  Where 
  Date<='20140619' 
  GROUP BY SchoolID) ob
     INNER JOIN
(
  SELECT SchoolID,SUM(Rice) AS Rice
  FROM tblDailyMidDayDetails
  WHERE Date<='20140619' 
GROUP BY SchoolID) dmdd
     ON
         ob.SchoolID = dmdd.SchoolID

这确保连接的每个SchoolID只有一行,这避免了在聚合某些值之前重复它们。

我猜您有一个问题,因为当前两个表中都存在相同SchoolID的多个行。你得到的问题在这里得到了说明。假设表1有以下数据:

代码语言:javascript
复制
SchoolID    Column1     Rice
1           abc         10
1           def         20

表2的数据如下:

代码语言:javascript
复制
SchoolID    Column2     Rice
1           ghi         30
1           jkl         40

在计算聚合之前执行联接的结果是创建以下行:

代码语言:javascript
复制
SchoolID    Column1     Rice    SchoolID     Column2     Rice
1           abc         10      1            ghi         30
1           abc         10      1            jkl         40
1           def         20      1            ghi         30
1           jkl         20      1            jkl         40

希望您能够理解为什么针对这个结果集的计算聚合会产生错误的结果。

票数 2
EN

Stack Overflow用户

发布于 2014-06-18 09:34:24

我们也可以这样做。

代码语言:javascript
复制
;WITH CTE AS  
    (Select SchoolID As SchoolID, 
  SUM (Rice) AS Rice
  FROM tblOpeningBalance 
  Where 
  Date<='20140619' 
  GROUP BY SchoolID)
,CTE2 AS 
  ( SELECT SchoolID As SchoolID,SUM(Rice) AS Rice
  FROM tblDailyMidDayDetails
  WHERE Date<='20140619' 
    GROUP BY SchoolID)

Select C.SchoolID,C.Rice - CC.Rice As RIce
     FROM CTE C
INNER JOIN CTE2 CC
    ON c.SchoolID = Cc.SchoolID
GROUP BY C.SchoolID
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24281264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档