我有3张表,每个表的编号和费用各不相同。
当对每个表单独运行查询时,它工作得很好,但是当我加入表时,我得到了所有的总计错误。第一表是部分清单,第二表是采购成本,第三表是销售成本。
我使用左外部联接从表1(部件列表)获取所有记录,并通过将table1中的no连接到table2和表1到table3,从而从表2和表3获得sum。表2和表3中可能没有出现所有的部分。当我得到错误的总数时,我试图将条件与连接一起移到最顶端,但仍然得到了相同的错误结果。有什么想法吗?任何指针都会有帮助。附加数据:我从diff系统获得表2和表3,需要定期报告。
表1
PART
A
B
C
D
E
F
G
H表2
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
PART SELL STREAM USAGE
D 4 Y PUF
G 2 Y PUF
A 5 Y PUF
W 1
Z 4
R 2 预期结果:
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 到现在为止这是我的密码。“
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。
发布于 2019-11-15 16:00:24
我认为,当您加入表3时,由于表2中的重复项,您正在复制表3。然后,您结束了对不需要的重复行的求和。我认为您应该使用子查询的总计或窗口功能。
子查询:
未测试的
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]。
进一步解释:
请考虑以下查询:
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。
发布于 2019-11-15 14:28:52
与其在GROUP BY使用HAVING会社发生后尝试执行筛选,不如在ON子句中执行筛选:
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]。
https://stackoverflow.com/questions/58878038
复制相似问题