Sql SUM()中的错误结果

Sql SUM()中的错误结果,sql,sql-server-2000,Sql,Sql Server 2000,SQL Server 2000-4个表,每个表3列。个人ID(COTA)、用户(Telegestionador)和工作价值量 表格为:Contactados、NC、FQ、OT 其中一个例子 XAV045 QUIPILDORY 26 XAV045 QUIPILDORY 29 XAV045 QUIPILDORY 21 XAV045 QUIPILDORY 39 XAV052 LOPEZRA 29 XAV052 LOPEZRA 39 XAV05

SQL Server 2000-4个表,每个表3列。个人ID(COTA)、用户(Telegestionador)和工作价值量

表格为:
Contactados、NC、FQ、OT

其中一个例子

XAV045  QUIPILDORY    26
XAV045  QUIPILDORY    29
XAV045  QUIPILDORY    21
XAV045  QUIPILDORY    39
XAV052  LOPEZRA       29
XAV052  LOPEZRA       39
XAV052  LOPEZRA       24
XAV052  LOPEZRA       36
我需要的是。带有ID、USER的结果视图,然后是带有按个人ID/用户分组的工作量总和的字段。(有4个表,所以在最终视图中我应该有6列)

所以,第一排应该是

XAV045,QUIPILDORY, 115, X, Y, Z
X、Y、Z表示其他三个表的
SUM()
结果

第一次尝试是:

SELECT     
   dbo.Contactados.COTA, dbo.Contactados.telegestionador, 
   SUM(dbo.Contactados.Total) AS Total, 
   SUM(dbo.OT.Total) AS [Cont-Der], 
   SUM(dbo.FQ.FQ) AS Cerrados, 
   SUM(dbo.NC.Total) AS NC
FROM
   dbo.Contactados 
LEFT OUTER JOIN
   dbo.OT ON dbo.Contactados.COTA = dbo.OT.COTA AND dbo.Contactados.telegestionador = dbo.OT.telegestionador AND dbo.Contactados.FGfin = dbo.OT.FGfin 
LEFT OUTER JOIN
   dbo.FQ ON dbo.Contactados.COTA = dbo.FQ.COTA AND dbo.Contactados.telegestionador = dbo.FQ.telegestionador AND dbo.Contactados.FGfin = dbo.FQ.FGfin 
LEFT OUTER JOIN
   dbo.NC ON dbo.Contactados.COTA = dbo.NC.COTA AND dbo.Contactados.telegestionador = dbo.NC.telegestionador AND dbo.Contactados.FGfin = dbo.NC.FGfin
GROUP BY 
   dbo.Contactados.telegestionador, dbo.Contactados.COTA
它抛出错误的结果,我知道
groupby
将结果分组,而不是将表中的行单独分组。但是我找不到合适的方法来做


有什么帮助吗?

假设所有四个表的四列数据类型相同,您可以使用union all列出所有值,然后作为子查询的一部分对这些值求和:

SELECT
COTA
,Telegestionador
,SUM(CASE WHEN table_name = 'Contactados' THEN work_value ELSE 0 END) AS Contactados_sum
,SUM(CASE WHEN table_name = 'NC' THEN work_value ELSE 0 END) AS nc_sum
,SUM(CASE WHEN table_name = 'FQ' THEN work_value ELSE 0 END) AS fq_sum
,SUM(CASE WHEN table_name = 'QT' THEN work_value ELSE 0 END) AS qt_sum
FROM
(
SELECT 
COTA
,Telegestionador
,work_value
,'Contactados' as table_name
FROM Contactados
UNION ALL
SELECT 
COTA
,Telegestionador
,work_value
,'NC' as table_name
FROM NC
UNION ALL
SELECT 
COTA
,Telegestionador
,work_value
,'FQ' as table_name
FROM FQ
UNION ALL
SELECT 
COTA
,Telegestionador
,work_value
,'QT' as table_name
FROM QT
) summary
GROUP BY
COTA
,Telegestionador

假设所有四个表的四列数据类型相同,则可以使用union all列出所有值,然后作为子查询的一部分对这些值求和:

SELECT
COTA
,Telegestionador
,SUM(CASE WHEN table_name = 'Contactados' THEN work_value ELSE 0 END) AS Contactados_sum
,SUM(CASE WHEN table_name = 'NC' THEN work_value ELSE 0 END) AS nc_sum
,SUM(CASE WHEN table_name = 'FQ' THEN work_value ELSE 0 END) AS fq_sum
,SUM(CASE WHEN table_name = 'QT' THEN work_value ELSE 0 END) AS qt_sum
FROM
(
SELECT 
COTA
,Telegestionador
,work_value
,'Contactados' as table_name
FROM Contactados
UNION ALL
SELECT 
COTA
,Telegestionador
,work_value
,'NC' as table_name
FROM NC
UNION ALL
SELECT 
COTA
,Telegestionador
,work_value
,'FQ' as table_name
FROM FQ
UNION ALL
SELECT 
COTA
,Telegestionador
,work_value
,'QT' as table_name
FROM QT
) summary
GROUP BY
COTA
,Telegestionador

您在问题中没有提到FGfin——这可能是导致您自己的查询结果出现问题的原因吗?不是,它只是先前表的一部分,但不包括在结果中。谢谢。不过,我不知道你的问题出在哪里,如果有的话。您是否需要:
SUM(dbo.FQ.TOTAL)作为Cerrados
?或者有一些COTA/telegestionador值没有Contactados记录?正如Davis所说,我需要使用完整的外部联接,但他提出了一个很好的解决方案。谢谢Sean。您在问题中没有提到FGfin——这可能是导致您自己的查询结果出现问题的原因吗?不是,它只是先前表的一部分,但不包括在结果中。谢谢。不过,我不知道你的问题出在哪里,如果有的话。您是否需要:
SUM(dbo.FQ.TOTAL)作为Cerrados
?或者有一些COTA/telegestionador值没有Contactados记录?正如Davis所说,我需要使用完整的外部联接,但他提出了一个很好的解决方案。谢谢Sean。在尝试了这个代码之后,它工作得很好。谢谢。我还没有考虑过这样的情况,我试图在联接内部进行选择,但您的此修复非常好。联接的问题是,您需要一个所有联系人的主列表,然后将外部联接保留到。您要走的路需要完全的外部连接,这会给查询增加相当大的开销!在尝试了这段代码之后,它工作得很好。谢谢。我还没有考虑过这样的情况,我试图在联接内部进行选择,但您的此修复非常好。联接的问题是,您需要一个所有联系人的主列表,然后将外部联接保留到。您要走的路需要完全的外部连接,这会给查询增加相当大的开销!