介绍上个月总和的新专栏

时间:2017-08-17 10:26:29

标签: mysql sql datetime group-by

我正在尝试为我的查询引入一个新列,它目前计算本月的费用总和,新列应显示上个月的费用。我不太确定在哪里放置它。

SELECT cat.id_kat,
       cat.nazwa,
       coalesce(exp.tot, 0) AS PriceTotal
FROM wydatki_kategorie cat
LEFT JOIN
  (SELECT wydatki_wpisy.kategoria,
          sum(wydatki_wpisy.brutto) AS tot
   FROM wydatki_wpisy
   LEFT JOIN wydatki ON wydatki_wpisy.do_wydatku = wydatki.id_wydatku
   WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())
     AND wydatki.id_kupujacy = 1
   GROUP BY wydatki_wpisy.kategoria) exp ON cat.id_kat = exp.kategoria

可能需要(如果我没错) - 上个月的Where子句。

 wydatki.data_zakupu >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) AND
 wydatki.data_zakupu<= DATE_SUB(NOW(), INTERVAL 1 MONTH)

SQL Fiddle example

1 个答案:

答案 0 :(得分:1)

两件事。

首先,如果您停止使用WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE())选择日期,您将获得三项好处。

  1. 您的日期搜索将变为sargable:索引会加快速度。
  2. 你会选择一个更通用的方案来选择月份。
  3. 如果您的表中有多年的数据,事情会更好。
  4. 相反,通常使用这种表达式来搜索当前月份。你已经弄清楚了大部分内容。

    WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
      AND wydatki.data_zakupu  < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 0 MONTH
    

    这将查找当月第一天午夜或之后的所有日期时间值,但不会在下个月第一天午夜<上查找。

    它概括为您想要的任何月份。例如,

    WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH
      AND wydatki.data_zakupu  < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
    

    上个月送你。这在当前月份是1月时也有效,并且当您在表格中有多年的数据时它会起作用。

    这些表达式有点冗长,因为MySQL没有FIRST_DAY(date)函数,只有a LAST_DAY(date) function。所以我们需要所有that + INTERVAL 1 DAY monkey business

    其次,取出上个月的数据就像在表中添加另一个LEFT JOIN ( SELECT...子句一样简单,就像这样。 (http://sqlfiddle.com/#!9/676df4/13

    SELECT ...
           coalesce(month1.tot, 0) AS LastMonth           
    FROM wydatki_kategorie cat
    LEFT JOIN 
          ...
    LEFT JOIN
      (SELECT wydatki_wpisy.kategoria,
              sum(wydatki_wpisy.brutto) AS tot
       FROM wydatki_wpisy
       LEFT JOIN wydatki ON wydatki_wpisy.do_wydatku = wydatki.id_wydatku
       WHERE wydatki.data_zakupu >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH
         AND wydatki.data_zakupu  < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
         AND wydatki.id_kupujacy = 1
       GROUP BY wydatki_wpisy.kategoria
      ) month1 ON cat.id_kat = month1.kategoria
    

    如您所见,此处的日期范围WHERE子句获取上个月的行。