代码之家  ›  专栏  ›  技术社区  ›  Kavvson Empcraft

为上月总和引入新列

  •  1
  • Kavvson Empcraft  · 技术社区  · 9 年前

    我试图为我的查询引入一个新列,它当前统计本月的费用总额,新列应显示上个月的费用。我不太确定把它放在哪里。

    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
    

     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 回复  |  直到 9 年前
        1
  •  1
  •   O. Jones    9 年前

    两件事。

    首先,如果你停止使用 WHERE MONTH(wydatki.data_zakupu) = MONTH(CURRENT_DATE()) 选择约会有三个好处。

    1. 您的日期搜索将变成 sargable :索引将加快速度。

    相反,通常使用这种表达式来搜索当前月份。你已经解决了大部分问题。

    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月时,这也有效,当您的表中有多年的数据时,它也有效。

    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