表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之间) ################################################## ###############
答案 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。