如何使用sqlite

时间:2017-11-21 18:29:12

标签: android sqlite group-by sum

表A和表B由三个字段组成,如pr_name,amount,date。[same]

pr_name金额日期

论文100 2017-01-10

论文50 2017-01-30

pen 100 2017-05-10

pen 200 2017-05-30

论文500 2017-11-21

表B与相同的A.expected结果集是:

Month_name表A表B

150年1月150日

2月0 0

...... ......

可能300 300

...

11月500 500

错误:

android.database.sqlite.SQLiteException:near" rowid&#34 ;:语法错误(代码1):,编译时:SELECT CASE rowid WHEN 1那么' jan'当2那么' feb'那么3,那么' mar'当4那么' apr' 5,然后可能'那么6,那么' jun'那么7,那么' jul'那时8,那么' aug'那么9那么' sep'那么10,那么' oct'那么11,那么' nov'那么12岁那么' dec' END作为Month_name,(SELECT SUM(e_amount)FROM RecordA WHERE strftime('%Y',e_dates)=' 2017' AND CAST(strftime('%m' ,e_dates)AS Integer)= c.rowid)AS'表A',(SELECT SUM(i_amount)FROM RecordB WHERE strftime('%Y',i_dates)=' 2017' AND CAST(strftime('%m',e_dates)AS整数)= c.rowid)AS'表B' FROM RecordA cWHERE rowid在1和12之间                                                                                     ################################################## ###############                                                                                     错误代码:1(SQLITE_ERROR)                                                                                     引起:SQL(查询)错误或缺少数据库。                                                                                         (接近" rowid&#34 ;:语法错误(代码1):,同时编译:SELECT CASE rowid WHEN 1那么' jan' WHEN 2那么' feb'当3那么' mar'当4,那么' apr' 5,那么'当6岁那么' jun' 7,那么' jul&# 39;当然后8岁那么'当然后9岁那么'当10岁那么'当11岁那么' nov' 12岁那么& #39; dec' END作为Month_name,(SELECT SUM(e_amount)FROM RecordA WHERE strftime('%Y',e_dates)=' 2017' AND CAST(strftime(&#) 39;%m',e_dates)AS整数)= c.rowid)AS'表A',(SELECT SUM(i_amount)FROM RecordB WHERE strftime('%Y', i_dates)=' 2017' AND CAST(strftime('%m',e_dates)AS整数)= c.rowid)AS'表B' FROM RecordA cWHERE rowid在1和12之间)                                                                                     ################################################## ###############

1 个答案:

答案 0 :(得分:0)

无法使用strftime从sqlite获取月份名称,因此我们必须使用case语句将1,2,3 ...转换为月份名称。为了确保即使没有特定月份的数据,我们也可以获得所有月份,我们可以使用rowid生成1到12的数字。为此使用任何至少有12行的表。然后使用子查询,我们可以获得这些月份所需的摘要数据:

SELECT CASE c.rowid WHEN 1 THEN 'jan' WHEN 2 THEN 'feb' WHEN 3 THEN 'mar'
  WHEN  4 THEN 'apr' WHEN 5 THEN 'may' WHEN 6 THEN 'jun' 
  WHEN 7 THEN 'jul' WHEN 8 THEN 'aug' WHEN 9 THEN 'sep' 
  WHEN  10 THEN 'oct' WHEN 11 THEN 'nov' WHEN 12 THEN 'dec' END as Month_name,
(SELECT SUM(amount) FROM TableA WHERE strftime('%Y', "date") = '2017'
 AND CAST(strftime('%m', "date") AS Integer) = c.rowid) AS 'Table A',
(SELECT SUM(amount) FROM TableB WHERE strftime('%Y', "date") = '2017'
 AND CAST(strftime('%m', "date") AS Integer) = c.rowid) AS 'Table B'
FROM TableX c
WHERE c.rowid BETWEEN 1 AND 12

注意:CAST不是必需的,但最好明确说明。 TableX可以是TableA。