【问题标题】:Sqlite count occurence per year每年发生的 Sqlite 计数
【发布时间】: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 :(

【问题讨论】:

    标签: sqlite group-by count sum


    【解决方案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() 更容易
    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2019-09-07
    • 2021-04-13
    相关资源
    最近更新 更多