每年发生的 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 计数的主要内容,如果未能解决你的问题,请参考以下文章