首页 > 解决方案 > 左外连接增加总和。如何预防?

问题描述

下面是查询的简化版本,但它的基本要点:

WITH ClientSpend AS
    (
        SELECT
            c.ClientName
            , CONVERT(INT, (ROUND(SUM(CASE WHEN e.Type = 1 THEN e.Dollars ELSE 0 END), 0))) AS 1_Dollars
            , CONVERT(INT, (ROUND(SUM(CASE WHEN e.Type = 2 THEN e.Dollars ELSE 0 END), 0))) AS 2_Dollars
            -- There's a bunch more of these for different 'Types'
        FROM Expense e WITH(NOLOCK)
            INNER JOIN Client c WITH(NOLOCK)
                ON c.ClientID = e.ClientID
        GROUP BY c.ClientName
    )
SELECT
    ClientName
    , 1_Dollars
    , 2_Dollars
FROM ClientSpend
GROUP BY ClientName

类型 2 有它自己的 Expense 表,它分解成更细化的细节,我需要在 CTE SELECT 中的最后一个 CASE/SUM 行。

我尝试使用 LEFT JOIN 对此 [ExpenseType2] 表尽可能多的索引来测试上述查询,并且我注意到执行此操作时 2_Dollars 上的 SUM 更高。我假设它正在制作多条记录,即使我没有从 [ExpenseType2] 表中选择任何内容。

我该如何防止这种情况?

谢谢,

标签: tsqlssms

解决方案


为什么不使用子查询?还是一个简单的选择语句?或者您可能需要使用示例数据断言更多信息。

SELECT first_name, 1_Dollars, 2_Dollars FROM  
(
    SELECT
        c.ClientName
        , CONVERT(INT, (ROUND(SUM(CASE WHEN e.Type = 1 THEN e.Dollars ELSE 0 END), 0))) AS 1_Dollars
        , CONVERT(INT, (ROUND(SUM(CASE WHEN e.Type = 2 THEN e.Dollars ELSE 0 END), 0))) AS 2_Dollars
        -- There's a bunch more of these for different 'Types'
    FROM Expense e WITH(NOLOCK)
        INNER JOIN Client c WITH(NOLOCK)
            ON c.ClientID = e.ClientID
    GROUP BY c.ClientName
) a 

推荐阅读