首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -总计都是错误的/意外的。

SQL -总计都是错误的/意外的。
EN

Stack Overflow用户
提问于 2019-11-15 13:27:37
回答 2查看 110关注 0票数 0

我有3张表,每个表的编号和费用各不相同。

当对每个表单独运行查询时,它工作得很好,但是当我加入表时,我得到了所有的总计错误。第一表是部分清单,第二表是采购成本,第三表是销售成本。

我使用左外部联接从表1(部件列表)获取所有记录,并通过将table1中的no连接到table2和表1到table3,从而从表2和表3获得sum。表2和表3中可能没有出现所有的部分。当我得到错误的总数时,我试图将条件与连接一起移到最顶端,但仍然得到了相同的错误结果。有什么想法吗?任何指针都会有帮助。附加数据:我从diff系统获得表2和表3,需要定期报告。

表1

代码语言:javascript
复制
PART
A
B
C
D
E
F
G
H

表2

代码语言:javascript
复制
 PART   COST    STREAM  USAGE
A   1   Y   PUF
D   5   Y   PUF
E   4   Y   PUF
G   2   Y   PUF
A   5   Y   PUF
C   1   Y   PUF
S   1       
T   4       
E   2   Y   PUF

表3

代码语言:javascript
复制
PART    SELL    STREAM  USAGE
D   4   Y   PUF
G   2   Y   PUF
A   5   Y   PUF
W   1       
Z   4       
R   2       

预期结果:

代码语言:javascript
复制
PART    SUM OF T2 COST  SUM OF T3 SELL
A   6   5
B   0   
C   1   
D   5   4
E   6   
F   0   
G   2   2
H       

到现在为止这是我的密码。“

代码语言:javascript
复制
SELECT
    dbo.[PART LIST].PART,
    SUM(dbo.[COST ALL].AMT) AS[COST TOTAL],
    SUM(dbo.[SELL ALL].AMT) AS[SELL TOTAL]
FROM
    dbo.[PART LIST]
    LEFT OUTER JOIN dbo.[SELL ALL]
        ON dbo.[PART LIST].PART = dbo.[SELL ALL].PART
    LEFT OUTER JOIN dbo.[COST ALL]
        ON dbo.[PART LIST].PART = dbo.[COST ALL].PART
GROUP BY
    dbo.[PART LIST].PART,
    dbo.[COST ALL].STREAM,
    dbo.[COST ALL].USAGE,
    dbo.[SELL ALL].STREAM,
    dbo.[SELL ALL].USAGE
HAVING
    (dbo.[COST ALL].STREAM = N'Y')
    AND (dbo.[COST ALL].USAGE = N'PUF')
    AND (dbo.[SELL ALL].STREAM = N'Y')
    AND (dbo.[SELL ALL].USAGE = N'PUF')

抱歉,刚开始的时候。希望上面的细节有助于在我的代码中找到bug。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-15 16:00:24

我认为,当您加入表3时,由于表2中的重复项,您正在复制表3。然后,您结束了对不需要的重复行的求和。我认为您应该使用子查询的总计或窗口功能。

子查询:

未测试的

代码语言:javascript
复制
SELECT dbo.[PART LIST].PART, [COST TOTAL], [SELL TOTAL]
FROM dbo.[PART LIST] PL
left outer join (
   select part, sum(amt) as [cost total]
   from dbo.[COST ALL]
   where STREAM = N'Y'
      and USAGE = N'PUF'
   group by part
) C_Total on C_Total.PART = PL.PART
left outer join (
   select part, sum(amt) as [sell total]
   from dbo.[SELL ALL]
   where STREAM = N'Y'
      and USAGE = N'PUF'
   group by part
) S_Total on S_Total.PART = PL.PART

如果您希望空值为0,则可以选择isnull([COST TOTAL],0) [COST TOTAL]

进一步解释:

请考虑以下查询:

代码语言:javascript
复制
select part, sum(amt) as [cost total]
from dbo.[COST ALL]
where STREAM = N'Y'
   and USAGE = N'PUF'
group by part

它返回每个部分1行和每个部分的总成本。将这些结果作为表使用,并将它们连接到部件列表表中。因为它是按部分分组的,所以不存在重复项。

你对SELL ALL表也是这样。如果您有其他表,则可以继续执行相同的操作。

我使用left join是因为我不知道“其他”表(在本例中所有的成本和销售额)是否包含部件列表中列出的每个部分的数据。如果没有,那么由于left join,没有数据的部分将返回null。

票数 1
EN

Stack Overflow用户

发布于 2019-11-15 14:28:52

与其在GROUP BY使用HAVING会社发生后尝试执行筛选,不如在ON子句中执行筛选:

代码语言:javascript
复制
SELECT
    dbo.[PART LIST].PART,
    SUM(dbo.[COST ALL].AMT) AS[COST TOTAL],
    SUM(dbo.[SELL ALL].AMT) AS[SELL TOTAL]
FROM
    dbo.[PART LIST]
    LEFT OUTER JOIN dbo.[SELL ALL]
        ON dbo.[PART LIST].PART = dbo.[SELL ALL].PART
        AND dbo.[SELL ALL].STREAM = N'Y'
        AND dbo.[SELL ALL].USAGE = N'PUF'
    LEFT OUTER JOIN dbo.[COST ALL]
        ON dbo.[PART LIST].PART = dbo.[COST ALL].PART
        AND dbo.[COST ALL].STREAM = N'Y'
        AND dbo.[COST ALL].USAGE = N'PUF'
GROUP BY
    dbo.[PART LIST].PART

现在只有您右边的相关记录--大多数表都是在JOIN上通过的,并且您可以正确地GROUP BY,只需您的[PART]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58878038

复制
相关文章

相似问题

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