【问题标题】:Using MySQL CASE to SUM last month and this month totals上个月和本月使用 MySQL CASE 求和
【发布时间】:2018-07-27 05:20:43
【问题描述】:

我有一个查询要从 2 个表中生成课程名称和总数的列表。它工作正常,但现在我想在同一个查询中获得本月和上个月的总数,所以我添加了几个案例。问题是这些案例返回的是空值。

这是我的查询:

$Sql = "SELECT t1.coursename, t1.id, SUM(t2.amount) AS total,

CASE 
WHEN YEAR(t2.date) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(t2.date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) THEN SUM(t2.amount)
ELSE 0 END 
AS lastMonthTotal,      

CASE
WHEN YEAR(t2.date) = YEAR(CURRENT_DATE) AND MONTH(t2.date) = MONTH(CURRENT_DATE) THEN SUM(t2.amount) 
ELSE 0 END 
AS thisMonthTotal

FROM t1
LEFT JOIN t2 ON t2.courseid = t1.courseid
WHERE $pdoCoursesString GROUP BY t1.courseid";

【问题讨论】:

  • 将所有这些案例条件放在 sum(amount) 下,并检查 group by 子句中的列

标签: mysql sql sum case


【解决方案1】:

我认为您应该将 CASE 语句放在 SUM 函数中。

SQL 小提琴:http://sqlfiddle.com/#!9/4e10e2/5

SQL:

测试数据:

create table t1(courseid int, coursename varchar(10));
create table t2(courseid int, date date, amount int);
insert into t1 values(1,'courseA');
insert into t1 values(2,'courseB');
insert into t2 values(1,'20180211',12);
insert into t2 values(1,'20180111',16);
insert into t2 values(2,'20180101',1);
insert into t2 values(2,'20180201',1);
insert into t2 values(2,'20180101',1);    

查询:

SELECT t1.coursename, t1.courseid, SUM(t2.amount) AS total,
SUM(
  CASE 
  WHEN YEAR(t2.date) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) 
  AND MONTH(t2.date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
  THEN 
    t2.amount
  ELSE 
    0 
  END
) AS lastmonthtotal,
SUM(
  CASE 
  WHEN YEAR(t2.date) = YEAR(CURRENT_DATE) 
  AND MONTH(t2.date) = MONTH(CURRENT_DATE) 
  THEN 
    t2.amount
  ELSE 
    0 
  END
) AS thismonthtotal
FROM t1
LEFT JOIN t2 ON t2.courseid = t1.courseid
GROUP BY t1.courseid
;

结果:

| coursename | courseid | total | lastmonthtotal | thismonthtotal |
|------------|----------|-------|----------------|----------------|
|    courseA |        1 |    28 |             16 |             12 |
|    courseB |        2 |     3 |              2 |              1 |

【讨论】:

  • 案例表达式,不是语句。
  • 感谢您的回答和 sql fiddle。这真的很有帮助
【解决方案2】:
sum(case when {condition} then {field} else 0 end)

【讨论】:

  • 请提供一些关于答案如何帮助 OP 的解释。
【解决方案3】:

将大小写放在 sum 中。

总和(当...的情况)

【讨论】:

    【解决方案4】:

    CASE 放在SUM 中,而不是相反。

    $Sql = "SELECT t1.coursename, t1.id, SUM(t2.amount) AS total,
    
    SUM(CASE WHEN YEAR(t2.date) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(t2.date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
             THEN t2.amount
             ELSE 0 END) AS lastMonthTotal,      
    
    SUM(CASE
        WHEN YEAR(t2.date) = YEAR(CURRENT_DATE) AND MONTH(t2.date) = MONTH(CURRENT_DATE) 
        THEN t2.amount 
        ELSE 0 END) AS thisMonthTotal
    
    FROM t1
    LEFT JOIN t2 ON t2.courseid = t1.courseid
    WHERE $pdoCoursesString GROUP BY t1.courseid";
    

    【讨论】:

      【解决方案5】:

      您应该在您的选择子句中对具有未聚合函数的相同列进行分组,例如 t1.coursename、t1.id 并使用 sum ( case... ) 例如:

      $Sql = "SELECT t1.coursename, t1.id, SUM(t2.amount) AS total,
      
         sum(  CASE 
          WHEN YEAR(t2.date) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(t2.date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) THEN t2.amount
          ELSE 0 END )
          AS lastMonthTotal,      
      
          sum( CASE
          WHEN YEAR(t2.date) = YEAR(CURRENT_DATE) AND MONTH(t2.date) = MONTH(CURRENT_DATE) THEN t2.amount
          ELSE 0 END )
          AS thisMonthTotal
      FROM t1
      LEFT JOIN t2 ON t2.courseid = t1.courseid
      WHERE $pdoCoursesString 
      GROUP BY t1.coursename, t1.id";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-10
        相关资源
        最近更新 更多