【问题标题】:I'm getting unexpected results when I use SUM(CASE WHEN .... THEN "column_name") in sqlite3当我在 sqlite3 中使用 SUM(CASE WHEN .... THEN "column_name") 时,我得到了意想不到的结果
【发布时间】:2020-07-14 06:00:26
【问题描述】:

我正在尝试查找 4 月份收到的订单数量。我有 3 个订单,但我的查询结果为 0。可能是什么问题?

这是表格:

id | first   | middle | last    | product_name  | numberOut | Date
1 | Muhammad | Sameer | Khan    | Macbook       | 1         | 2020-04-01
2 | Chand    | Shah   | Khurram | Dell Optiplex | 1         | 2020-04-02
3 | Sultan   |        | Chohan  | HP EliteBook  | 1         | 2020-03-31
4 | Express  | Eva    | Plant   | Dell Optiplex | 1         | 2020-03-11
5 | Rana     | Faryad | Ali     | HP EliteBook  | 1         | 2020-04-02

这是查询:

SELECT SUM(CASE WHEN strftime('%m', oDate) = '04' THEN 'id' END) FROM orders;

【问题讨论】:

    标签: sql sqlite date flask node-sqlite3


    【解决方案1】:

    如果您想要所有个四月,那么您只需查看月份即可。我会推荐:

    select count(*)
    from orders o
    where o.date >= '2020-04-01' and o.date < '2020-05-01';
    

    请注意,这会将datewhere 子句中的有效日期进行直接比较。

    【讨论】:

    • 我正在尝试在具有多个列表索引的单个 SQL 查询中获取所有月份的结果
    【解决方案2】:

    你的代码的问题是这样的:

    THEN 'id'
    

    您正在使用聚合函数 SUM() 并且您对像 'id' 这样的字符串文字求和,它被隐式转换为 0(因为它不能转换为数字)所以结果是 0 .
    即使您删除单引号,您也不会得到您想要的结果,因为您将得到 ids 的总和。
    但如果你使用:

    THEN 1 ELSE 0
    

    那么你会得到正确的结果。
    但是使用 SQLite 你可以写得更简单:

    SELECT SUM(strftime('%m', oDate) = '04') FROM orders;
    

    没有CASE 表达式。
    或者,既然您只是想计算订单,那么COUNT() 会这样做:

    SELECT COUNT(*) FROM orders WHERE strftime('%m', oDate) = '04';
    

    编辑。
    如果要统计所有月份的订单,请按月份分组:

    SELECT strftime('%Y-%m', oDate) AS month, 
           COUNT(*) AS number_of_orders
    FROM orders 
    GROUP BY month;
    

    【讨论】:

      【解决方案3】:
      SELECT SUM(CASE WHEN strftime('%m', oDate) = '04' THEN 1 ELSE 0 END) FROM orders; 
      

      如果你需要使用 SUM

      【讨论】:

        【解决方案4】:

        您的查询有问题。您不需要执行该聚合操作。

        SELECT COUNT(*) from table_name WHERE strftime('%m', Date) = '04';
        

        【讨论】:

          【解决方案5】:

          我会使用显式日期比较而不是日期函数 - 这使得查询 SARGeable,即它可能有利于现有索引。

          最有效的方法,在where 子句中使用过滤器:

          select count(*) cnt
          from orders 
          where oDate >= '2020-04-01' and oDate < '2020-05-01'
          

          或者,如果您想要 0 的结果,即使 4 月份没有订单,您也可以按照您最初的意图进行条件聚合:

          select sum(case when oDate >= '2020-04-01' and oDate < '2020-05-01' then 1 else 0 end) cnt
          from orders
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-27
            • 1970-01-01
            • 2019-09-12
            • 2021-04-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多