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

标签 mysql sql gaps-and-islands

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

这是我的 table

|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....

我怎样才能做到这一点?

最佳答案

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

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 查询。

fiddle 是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')

fiddle here .

关于mysql - 如何使用一系列日期和每月计数创建查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20009646/

相关文章:

MySQL 查询将值与前一行的值进行比较

mysql - 查询以查找两条记录之间的差异

SQL Server - 通过标志总结日期

sql - 按名称分组的连续日期范围内的最小和最大日期

mysql - VB.Net MySql命令参数MD5

php - SQL 语法错误 - 插入语句

java - 在 solr 查询中不工作小于运算符

javascript - 相同的嵌套查询

mysql - 需要输出记录

mysql - 从自动增量主键中获取已删除主键的列表