Mysql where子句中断计算查询

Mysql where子句中断计算查询,mysql,Mysql,不知是否有人能指出我下面代码中的错误。我有一个mysql查询,它按月显示销售线索,然后计算转换为销售额的百分比。如果我在其中添加where子句,它会打断total列,因为它的输出与Comms列相同 Select q.*, ROUND(100 * Comms / Total, 2) As Conversion, If(q.Adviser Is Null, 1, 0) As remove From (Select a.ContactFullName As Advise

不知是否有人能指出我下面代码中的错误。我有一个mysql查询,它按月显示销售线索,然后计算转换为销售额的百分比。如果我在其中添加where子句,它会打断total列,因为它的输出与Comms列相同

  Select
  q.*,
  ROUND(100 * Comms / Total, 2) As Conversion,
  If(q.Adviser Is Null, 1, 0) As remove
From
  (Select
      a.ContactFullName As Adviser,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 1) AS Jan,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 2) As Feb,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 3) As Mar,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 4) As Apr,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 5) As May,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 6) As Jun,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 7) As Jul,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 8) As Aug,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 9) As Sep,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 10) As Oct,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 11) As Nov,
      SUM(YEAR(b.CaseDate) = 2013 AND Month(b.CaseDate) = 12) As Dece,
      Count(b.CaseID) As Total,
      Sum(Case When Year(b.StatusSubmittedDate) = 2013 Then 1 Else 0
      End) As Comms

    From
      tblcontacts a Inner Join
无WHERE子句输出

Total - Comms - Conversion
479   -  148  - 30.9%
Total - Comms - Conversion
148   -  148  - 100%
输出WHERE子句

Total - Comms - Conversion
479   -  148  - 30.9%
Total - Comms - Conversion
148   -  148  - 100%
我搞不懂为什么会发生这种事


亲切问候

更新:

我重写了你的整个问题:

Select
  q.*,
  totals.total,
  ROUND(100 * Comms / totals.total, 2) As Conversion
  If(q.Adviser Is Null, 1, 0) As remove
From
  (Select
      a.ContactFullName As Adviser,
      Sum(Month(b.CaseDate) = 1) As Jan,
      Sum(Month(b.CaseDate) = 2) As Feb,
      Sum(Month(b.CaseDate) = 3) As Mar,
      Sum(Month(b.CaseDate) = 4) As Apr,
      Sum(Month(b.CaseDate) = 5) As May,
      Sum(Month(b.CaseDate) = 6) As Jun,
      Sum(Month(b.CaseDate) = 7) As Jul,
      Sum(Month(b.CaseDate) = 8) As Aug,
      Sum(Month(b.CaseDate) = 9) As Sep,
      Sum(Month(b.CaseDate) = 10) As Oct,
      Sum(Month(b.CaseDate) = 11) As Nov,
      Sum(Month(b.CaseDate) = 12) As Dece,
      Count(b.StatusSubmittedDate) As Comms

    From
      tblcontacts a Inner Join
      tblcases b On a.ContactID = b.ContactAssignedTo 
      WHERE Year(b.StatusSubmittedDate) = 2013
    Group By
      a.ContactFullName With Rollup) q
    inner join (select  a.ContactFullName As Adviser, count(*) as total from
    tblcontacts a Inner Join
      tblcases b On a.ContactID = b.ContactAssignedTo 
      WHERE Year(b.StatusSubmittedDate) = 2013
      group by Adviser
      )totals on q.Adviser = totals.Adviser
原始答案:

要进行多次计数,您可以这样解决:

      Count(b.CaseID) As Total,
      SUM(CASE WHEN YEAR(b.StatusSubmittedDate) = 2013 THEN 1 ELSE 0 END) As Comms,
但这是:

      ROUND(100 * Count(b.StatusSubmittedDate) / Count(b.CaseID),
不起作用,因为这个计算必须在以后进行

Select
  q.*,
  ROUND(100 * Comms / Total, 2) As Conversion,
  If(q.Adviser Is Null, 1, 0) As remove
From
  (Select
      a.ContactFullName As Adviser,
      Sum(Month(b.CaseDate) = 1 and year(b.CaseDate) = 2012) As Jan,
      ... Dec,
      Count(b.CaseID) As Total,
      SUM(CASE WHEN YEAR(b.StatusSubmittedDate) = 2013 THEN 1 ELSE 0 END) As Comms
    From
      tblcontacts a Inner Join
      tblcases b On a.ContactID = b.ContactAssignedTo 
    Group By
      a.ContactFullName With Rollup) q

您好,谢谢您的输入,我确实尝试过,但抛出了一个错误“您的SQL语法有错误;”@gary更新了我的答案,应该是正确的,现在开始工作。@tombom-再次感谢您,使用您的代码示例,如果我更改了comms列的年份,这很好,但是total列和所有月份值保持不变,无论年份如何。如果我输入2012年或2013年,总数是相同的479?再次感谢……非常感谢您宝贵的意见。如果我将“CASE WHEN”添加到现有查询中,它将显示正确的总数,但无论我输入什么年份,它都会显示相同的总数。如果我输入2012或2112,则输出相同-如果我使用第二个建议,则在“字段列表”中抛出“#1054-未知列”b.StatusSubmittedDate”。我试着把线移来移去,但没有成功。再次感谢..你的第一期是指每月的总数?当然,您必须将这些行更改为
SUM(年(b.CaseDate)=2013年,月(b.CaseDate)=1)作为一月,
。关于你的第二个问题-你试过我的答案的最新版本了吗?在外部查询中,我在转换时写下了
ROUND(100*Comms/Total,2)
@gary更新了我的答案,重写了你的整个查询。非常感谢你在这方面花费的时间,我在外部查询中尝试了你的答案的最新版本,只是准确地复制到了查询窗口中。它工作得很好,但我被困在总计栏中,不管我查询的是哪一年,它总是显示479。再次感谢..发现了一个小错误,您必须在内部和外部查询中同时添加where子句。请使用重写的查询重试。