【问题标题】:Using Case statement in sqlite, trouble getting the results I'm looking for在 sqlite 中使用 Case 语句,无法获得我正在寻找的结果
【发布时间】:2014-03-28 14:03:03
【问题描述】:

我在使用 SQL 查询时遇到了困难。我正在使用 sqlite。

我有一张桌子expenses。我正在尝试使用CASEstatement 来选择和求和值。以下是一些示例数据:

这是没有得到我想要的查询...

SELECT e.category, 
  CASE 
    WHEN e.schedule ='None' AND e.created_at > '2014-02-01 00:00:00 +0000' THEN SUM(e.amount) 
    WHEN e.schedule = 'Daily' THEN SUM(e.amount)*28.000000 
    WHEN e.schedule = 'Mon - Fri' THEN SUM(e.amount)*20 
    WHEN e.schedule = 'Weekly' THEN SUM(e.amount)*4.000000 
    WHEN e.schedule = 'Every 4 Weeks' THEN SUM(e.amount)*1.083333333333 
    WHEN e.schedule = 'Monthly' THEN SUM(e.amount)*1 
  ELSE 0 
  END 
AS totalValue FROM expenses e GROUP BY e.category ORDER BY e.category

下面是查询返回的图片。

我希望看到Housing 420 的总价值,这是因为category 为“Housing”的三个记录,其中一个的schedule 为“None”(记录 id 2) 并于 1 月创建。另外两个(记录 10 和 16)的 schedule 为每月。在我的CASE 中,我尝试只选择created_at 大于2 月1 日的时间表:

    WHEN e.schedule ='None' AND e.created_at > '2014-02-01 00:00:00 +0000' THEN SUM(e.amount)

或者使用“无”以外的计划值,在这种情况下:

    WHEN e.schedule = 'Monthly' THEN SUM(e.amount) 

不幸的是,我得到了 495 (300 + 120 + 75) 的结果。如果找到符合案例陈述的记录,它会将所有记录与特定的category 相加!

请你帮我重写案例,以便我得到我正在寻找的结果。

【问题讨论】:

    标签: sql sqlite select sum case


    【解决方案1】:

    查询的一个问题是您在select 列表中使用e.schedule,但它不在group by 中。这通常是问题的征兆。

    我认为您想将整个 case 语句移动到 sum() 内:

    SELECT e.category, 
           SUM(CASE WHEN e.schedule ='None' AND e.created_at > '2014-02-01 00:00:00 +0000' THEN e.amount
                    WHEN e.schedule = 'Daily' THEN e.amount*28.000000 
                    WHEN e.schedule = 'Mon - Fri' THEN e.amount*20 
                    WHEN e.schedule = 'Weekly' THEN e.amount*4.000000 
                    WHEN e.schedule = 'Every 4 Weeks' THEN e.amount*1.083333333333 
                    WHEN e.schedule = 'Monthly' THEN e.amount*1 
                    ELSE 0 
               END) as totalValue
    FROM expenses e
    GROUP BY e.category
    ORDER BY e.category;
    

    否则,您可能希望将 e.schedule 移动到 group by 子句,以便为每个类别中的每个计划设置单独的行。

    【讨论】:

    • 感谢您的回答,我会检查一下,看看是否有预期的结果。谢谢。然而,碰巧的是,我确实在 group by 中有 e.category,请参阅上面查询中的最后一行:'AS totalValue FROM costs e GROUP BY e.category ORDER BY e.category'
    • 谢谢你这似乎工作!真是一种解脱,谢谢。
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多