【问题标题】:SUM with multiple LEFT JOINS with VIEWS带有多个 LEFT JOINS 和 VIEWS 的 SUM
【发布时间】:2021-03-11 22:37:46
【问题描述】:

我需要对两个不同表(prognosis_scores 和 question_scores)中的两列(pts_won)求和,但它不能正常工作。 如果有很多progression_scores 或很多question_scores,则总和将不准确(例如,如果有一个question_scores 和三个progression_scores,则总和将加上您question_scores 的pts_won 的3 倍):

这里总和的结果是 30,我希望它是 10

| prognosis_scores | question_scores|
| ---------------- | -------------- |
| pts_won          | pts_won        |

这是我的代码

    CREATE VIEW score_calculations
    AS SELECT 
    users.id as user_id,
    users.name as name,
    users.company_id as company_id,
    users.team_id as team_id,
    users.email_verified as email_verified,
    -- users.email as email,
    SUM(COALESCE(prognosis_scores."pts_won", 0) + COALESCE (question_scores."pts_won", 0) ) as pts_won,
    SUM(prognosis_scores."good_gap") as good_gap,
    SUM(prognosis_scores."good_score") as good_score,
    SUM(prognosis_scores."isGoodPrognosis"::INT) as good_winner
    FROM users
    
    LEFT JOIN prognosis_scores
    ON prognosis_scores.user_id=users.id
    LEFT JOIN question_scores
    ON question_scores.user_id=users.id
    GROUP BY users.id , users.name, users.company_id,team_id,email_verified;

我怎样才能通过一次将两者相加来解决这个问题?

【问题讨论】:

    标签: sql database postgresql view


    【解决方案1】:

    在 Postgres 中,这可能是最简单的横向连接:

    SELECT u.id as user_id, u.name, u.company_id, u.team_id, u.email_verified,
    -- users.email as email,
       COALESCE(ps.pts_won, 0) + COALESCE (qs.pts_won, 0) ) as pts_won,
       ps.good_gap, ps.good_score, ps.good_winner
    FROM users u LEFT JOIN LATERAL
         (SELECT SUM(ps."pts_won") as pts_won,
                 SUM(ps.good_gap) as good_gap,
                 SUM(ps.good_score) as good_score,
                 SUM(ps."isGoodPrognosis"::INT) as good_winner
          FROM prognosis_scores ps
          WHERE ps.user_id = u.id
         ) ps
         ON 1=1 LEFT JOIN LATERAL
         (SELECT SUM(qs."pts_won") as pts_won
          FROM question_scores qs
          WHERE qs.user_id = u.id
         ) qs
         ON 1=1;
    

    这可以让您在执行JOIN 之前进行汇总 -- 所以总数是准确的。

    注意事项:

    • 表别名使查询更易于编写和阅读。
    • 默认列别​​名列名,所以不用写u.name as name。我想,如果你喜欢打字也没什么坏处。
    • 避免在列上使用双引号。如果表格是这样定义的,你会被卡住——所以你应该修正这个定义。

    【讨论】:

    • 嗨,有没有办法优化这个查询?当我有成千上万的用户和成千上万的预测时,这个查询真的很长(10 秒)前一个真的很快(200 毫秒)我想知道是否有可能修复这个 Thx
    • @B.Samuel 。 . .这可能值得提出一个新问题。包括查询、它应该做什么以及有关表的信息,例如它们的大小。
    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多