每年发生的 Sqlite 计数

Posted

技术标签:

【中文标题】每年发生的 Sqlite 计数【英文标题】:Sqlite count occurence per year 【发布时间】:2021-10-13 08:57:01 【问题描述】:

假设我的 Sqlite 数据库中有一个表,其中包含有关某些文件的一些信息,其结构如下:

|  id  |   file format  |          creation date           |
----------------------------------------------------------
|   1  |      Word      |    2010:02:12 13:31:33+01:00     |
|   2  |      PSD       |    2021:02:23 15:44:51+01:00     |
|   3  |      Word      |    2019:02:13 14:18:11+01:00     |
|   4  |      Word      |    2010:02:12 13:31:20+01:00     |
|   5  |      Word      |    2003:05:25 18:55:10+02:00     |
|   6  |      PSD       |    2014:07:20 20:55:58+02:00     |
|   7  |      Word      |    2014:07:20 21:09:24+02:00     |
|   8  |      TIFF      |    2011:03:30 11:56:56+02:00     |
|   9  |      PSD       |    2015:07:15 14:34:36+02:00     |
|  10  |      PSD       |    2009:08:29 11:25:57+02:00     |
|  11  |      Word      |    2003:05:25 20:06:18+02:00     |

我希望结果能够显示在给定年份中每种文件格式创建了多少个年表 - 类似于以下内容:

 |Format| 2003 | 2009 | 2010 | 2011 | 2014 | 2015 | 2019 | 2021 |    
 ----------------------------------------------------------------
 | Word |   2  |  0   |   0  |   2  |  0   |   0  |   2  |  0   |    
 | PSD  |   0  |  1   |   0  |   0  |  1   |   1  |   0  |  1   |
 | TIFF |   0  |  0   |   0  |   1  |  0   |   0  |   1  |  0   |

我已经有点接近(我认为)了,但我卡住了:

SELECT 
    file_format, 
    COUNT(CASE file_format WHEN creation_date LIKE '%2010%' THEN 1 ELSE 0 END),
    COUNT(CASE file_format WHEN creation_date LIKE '%2011%' THEN 1 ELSE 0 END),
    COUNT(CASE file_format WHEN creation_date LIKE '%2012%' THEN 1 ELSE 0 END)
FROM 
    fileinfo 
GROUP BY
    file_format;

当我这样做时,我会获得每种文件格式的唯一数量,但每年的数量相同......

 |Format| 2010 | 2011 | 2012 |  
 -----------------------------
 | Word |   4  |  4   |   4  |    
 | PSD  |   1  |  1   |   1  |  
 | TIFF |   6  |  6   |   6  | 

为什么我得到的计数不正确,此外,是否有一种更智能的查询方式,不依赖于每年作为字符串静态搜索的年份?如果有帮助,可以切换列标题和行标题——对我来说没关系。请帮助一个n00b :(

【问题讨论】:

【参考方案1】:

使用SUM()聚合函数进行条件聚合:

SELECT file_format, 
       SUM(creation_date LIKE '2010%') AS `2010`,
       SUM(creation_date LIKE '2011%') AS `2011`,
       ..........................................
FROM fileinfo 
GROUP BY file_format;

请参阅demo。

【讨论】:

啊哈——成功了!你能帮我理解我的查询做错了什么吗? @dongle 您的 CASE 表达式的问题是您使用 ELSE 0,这意味着该项目已被计算在内。如果您删除所有 ELSE 部分,它将起作用:dbfiddle.uk/… 但 SUM() 更容易

以上是关于每年发生的 Sqlite 计数的主要内容,如果未能解决你的问题,请参考以下文章

在 SQLite 中按计数排序单行数组

Sqlite 中每个类别的前 n 个计数

重置 SQLite3/MySQL 中的行数计数

java android sqlite获取结果计数

sql Sqlite - 重置表计数器自动索引

sqlite3中的关键字计数