我在SQL查询方面遇到了困难。我在用sqlite。
我有一张桌子expenses
。我试图使用CASE
语句来选择和求和值。以下是一些样本数据:
这是一个没有得到我想要的.
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
“住房”的记录,其中一条的schedule
为"None“(record 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)
或具有"None“以外的附表值,在本例中:
WHEN e.schedule = 'Monthly' THEN SUM(e.amount)
不幸的是,我得到的结果是495 (300 + 120 + 75)。如果它找到一条符合case语句的记录,那么它就是用一个特定的category
对所有记录进行求和!
请你帮我改写一下箱子,这样我就能得到我想要的结果了。
发布于 2014-02-26 02:03:17
查询的一个问题是,您正在select
列表中使用select
,但它不在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
子句中,以便为每个类别中的每个计划有一个单独的行。
https://stackoverflow.com/questions/22029603
复制相似问题