【问题标题】:select sum ignoring group by选择总和忽略组
【发布时间】:2012-07-19 20:24:12
【问题描述】:

似乎无法正确调整我的查询;任何帮助将不胜感激。

这是我的查询:

SELECT 
  wordlist.Word,
  SUM( worddocfreq.Freq ) AS wordFreq
FROM sourceparsed
  LEFT JOIN worddocfreq ON sourceparsed.ParsedID = worddocfreq.ParsedID
  LEFT JOIN wordlist ON worddocfreq.WordID = wordlist.WordID
WHERE
  sourceparsed.SrcID = 30032
GROUP BY
  wordlist.Word

这按预期工作,作为示例结果集,我得到两列:第一列是不同单词的列表,第二列是每个单词的频率。

但是,我宁愿调整查询,使第二列改为比例(即每个单词出现次数的总和除以总单词数)。单词总数将由第二列的总和给出,因为它是上面写的查询的输出。

所以,我的问题是我不确定如何计算单词总数的总和,因为查询末尾的“分组依据”追溯性地强制计算每个单词的总和。所以,我不知道如何将我的第二列除以计算的总和,而与“分组依据”术语无关。

我感觉需要嵌套选择,但我不确定如何以最佳方式集成它。

提前感谢您的任何建议。

干杯,

布赖恩

【问题讨论】:

    标签: mysql select group-by sum


    【解决方案1】:

    我不确定这是最有效的方法,但试一试:

    SELECT 
      wordlist.Word,
      SUM( worddocfreq.Freq ) / ( SELECT SUM( Freq ) 
                                  FROM worddocfreq 
                                    JOIN sourceparsed ON 
                                          sourceparsed.SrcID = sp1.SrcID
                                      AND sourceparsed.ParsedID = worddocfreq.ParsedID
                                ) AS proportion
    FROM sourceparsed sp1
      LEFT JOIN worddocfreq ON sourceparsed.ParsedID = worddocfreq.ParsedID
      LEFT JOIN wordlist ON worddocfreq.WordID = wordlist.WordID
    WHERE
      sourceparsed.SrcID = 30032
    GROUP BY
      wordlist.Word
    

    【讨论】:

    • 谢谢,但不完全在那里。 “(SELECT SUM(Freq) FROM worddocfreq)”部分获取 worddocfreq 表每一行的总和。我仍然需要从仅与 sourceparsed 表中的 ParsedID 匹配的行计算“总和”,其中 SrcID 为 30032 在 sourceparsed 表中......换句话说,这在对“总和”求和时忽略了连接跨度>
    • 好的,我明白了。我在内部 SELECT 中添加了一个 JOIN - 这有帮助吗?
    • 非常接近,但我制定的最终工作语法包含在我的 OP 的编辑版本中
    【解决方案2】:

    子查询的CROSS JOIN 可能(或可能不会)比 SetFreeByTruth 的方法更有效:

    SELECT 
      wordlist.Word,
      SUM( worddocfreq.Freq ) / TotalFreq.TotalFreq AS wordFreq
    FROM sourceparsed
      LEFT JOIN worddocfreq ON sourceparsed.ParsedID = worddocfreq.ParsedID
      LEFT JOIN wordlist ON worddocfreq.WordID = wordlist.WordID
      CROSS JOIN ( SELECT SUM( Freq ) AS TotalFreq FROM worddocfreq ) AS TotalFreq
    WHERE
      sourceparsed.SrcID = 30032
    GROUP BY
      wordlist.Word
    

    【讨论】:

      【解决方案3】:

      小心除以零错误。可能有更好的方法,但您可以尝试以下方法:

      select c,wordFreq,sum_all, wordFreq/sum_all as proportion from 
      (
      
          (
      
              select wordlist.Word,
              sum(worddocfreq.Freq) as wordFreq
              from sourceparsed
              left join worddocfreq on sourceparsed.ParsedID = worddocfreq.ParsedID
              left join wordlist on worddocfreq.WordID = wordlist.WordID
              where sourceparsed.SrcID = 30032
              group by wordlist.Word
      
          ) c
         LEFT OUTER JOIN
         (select SUM(worddocfreq.Freq) sum_all  
          from sourceparsed
          left join worddocfreq on sourceparsed.ParsedID = worddocfreq.ParsedID
          left join wordlist on worddocfreq.WordID = wordlist.WordID 
          where sourceparsed.SrcID = 30032
         ) t
         ON 1=1
      ) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 2012-01-28
        • 2018-06-06
        • 2012-02-26
        相关资源
        最近更新 更多