Sql SUM()中的错误结果
SQL Server 2000-4个表,每个表3列。个人ID(COTA)、用户(Telegestionador)和工作价值量 表格为: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
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。在尝试了这个代码之后,它工作得很好。谢谢。我还没有考虑过这样的情况,我试图在联接内部进行选择,但您的此修复非常好。联接的问题是,您需要一个所有联系人的主列表,然后将外部联接保留到。您要走的路需要完全的外部连接,这会给查询增加相当大的开销!在尝试了这段代码之后,它工作得很好。谢谢。我还没有考虑过这样的情况,我试图在联接内部进行选择,但您的此修复非常好。联接的问题是,您需要一个所有联系人的主列表,然后将外部联接保留到。您要走的路需要完全的外部连接,这会给查询增加相当大的开销!