如何使用一系列日期和每月计数创建查询?

Posted

技术标签:

【中文标题】如何使用一系列日期和每月计数创建查询?【英文标题】:How can i create a query using a range of dates and count per month? 【发布时间】:2013-11-15 20:05:00 【问题描述】:

我正在尝试为我的策略创建一个范围

这是我的桌子

|policies|
  |id|   |date_ini|   |date_end|
   1     2013-01-01   2014-01-01      
   2     2012-02-01   2013-02-01     
   3     2013-03-01   2013-03-03     
   4     2013-04-01   2013-08-01     

我正在尝试创建这样的范围

 date_ini <=    range_of_each_policy    <= date_end

这是使用 2013 年的逻辑

|jan| |feb| |mar| |apr| |may| |jun| |jul| |ago| |sep| |oct| |nov| |dic|
 id1   id1   id1   id1   id1   id1   id1   id1   id1   id1   id1   id1
 id2   id2   __________________________________________________________
 __________  id3 ______________________________________________________
 _______________   id4   id4   id4   id4   id4  _______________________ 

还会按月显示

 jan  feb   mar  apr.........
  3    3     2    2....

我该怎么做?

有人可以帮帮我吗?

【问题讨论】:

【参考方案1】:

不是有史以来最干净的查询...但这就是您要找的吗?

SET @year := 2013;

SELECT
  CASE WHEN CONCAT(@year, '-01-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Jan,
  CASE WHEN CONCAT(@year, '-02-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Feb,
  CASE WHEN CONCAT(@year, '-03-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Mar,
  CASE WHEN CONCAT(@year, '-04-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Apr,
  CASE WHEN CONCAT(@year, '-05-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END May,
  CASE WHEN CONCAT(@year, '-06-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Jun,
  CASE WHEN CONCAT(@year, '-07-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Jul,
  CASE WHEN CONCAT(@year, '-08-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Aug,
  CASE WHEN CONCAT(@year, '-09-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Sep,
  CASE WHEN CONCAT(@year, '-10-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Oct,
  CASE WHEN CONCAT(@year, '-11-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END Nov,
  CASE WHEN CONCAT(@year, '-12-01') BETWEEN date_ini AND date_end THEN CONCAT('id', id) END `Dec`
FROM
  policies
WHERE
  date_end >= CONCAT(@year, '-01-01')
  AND 
  date_ini <= CONCAT(@year, '-12-01')

但我认为使用一些代码来表示结果通常会更好,例如。使用 php,而不是使用 mysql 查询。

小提琴是here。

编辑

这个查询是求和:

SET @year := 2013;

SELECT
  SUM(CONCAT(@year, '-01-01') BETWEEN date_ini AND date_end) Jan,
  SUM(CONCAT(@year, '-02-01') BETWEEN date_ini AND date_end) Feb,
  SUM(CONCAT(@year, '-03-01') BETWEEN date_ini AND date_end) Mar,
  SUM(CONCAT(@year, '-04-01') BETWEEN date_ini AND date_end) Apr,
  SUM(CONCAT(@year, '-05-01') BETWEEN date_ini AND date_end) May,
  SUM(CONCAT(@year, '-06-01') BETWEEN date_ini AND date_end) Jun,
  SUM(CONCAT(@year, '-07-01') BETWEEN date_ini AND date_end) Jul,
  SUM(CONCAT(@year, '-08-01') BETWEEN date_ini AND date_end) Aug,
  SUM(CONCAT(@year, '-09-01') BETWEEN date_ini AND date_end) Sep,
  SUM(CONCAT(@year, '-10-01') BETWEEN date_ini AND date_end) Oct,
  SUM(CONCAT(@year, '-11-01') BETWEEN date_ini AND date_end) Nov,
  SUM(CONCAT(@year, '-12-01') BETWEEN date_ini AND date_end) `Dec`
FROM
  policies
WHERE
  date_end >= CONCAT(@year, '-01-01')
  AND 
  date_ini <= CONCAT(@year, '-12-01')

小提琴here。

【讨论】:

fthiella 我如何计算每个月?例如在 1 月、2 月、3 月计数所有...您的代码是正确的,但我也需要。你能帮我解决这个问题吗? @CarlitosMorales 请查看我编辑的答案。但是你确定 jan 和 feb 应该给 3 吗?我得到 2,如果我理解你的逻辑,它应该是正确的...... 抱歉,我的错,你是对的,我会在几分钟内检查你的代码 :) OMG.......很棒的工作......"tu sei grande" =) ....你做到了,我认为没有人能帮上忙。谢谢,赢了点=) 我有最后一个问题,你能解释一下吗? date_end >= CONCAT(@year, '-01-01') AND date_ini

以上是关于如何使用一系列日期和每月计数创建查询?的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中,您将如何使用两个日期列计算每月和每日总计?

每月计数

固定日期范围之间的 MySQL 记录

如何给用户两个选项来选择日期(每天和每月)

如何在bigquery中按月创建分区

在不指定初始和结束日期的情况下编写每月查询的自动方式?