Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite SQL:简单求和查询,与其他两个表连接_Sqlite_Spatialite - Fatal编程技术网

Sqlite SQL:简单求和查询,与其他两个表连接

Sqlite SQL:简单求和查询,与其他两个表连接,sqlite,spatialite,Sqlite,Spatialite,我在sqlite中有3个表,如下所示: ID | x | x_agg 1, 2, 21 2, 3, 14 3, 4, 11 4, 3, 10 表1 ID | x 1, 2.0 2, 3.0 3, 4.0 4, 3.0 表2 join_ID | x 1, 5.0 1, 6.0 2, 5.0 2, 2.0 3, 2.0 4, 2.0 表3 join_ID | x 4, 5.0 1, 6.0 3, 5.0 2, 2.0 2, 2.0 1, 2.0 我想获得如下表格: ID | x | x_ag

我在sqlite中有3个表,如下所示:

ID | x | x_agg
1, 2, 21
2, 3, 14
3, 4, 11
4, 3, 10
表1

ID | x
1, 2.0
2, 3.0
3, 4.0
4, 3.0
表2

join_ID | x
1, 5.0
1, 6.0
2, 5.0
2, 2.0
3, 2.0
4, 2.0
表3

join_ID | x
4, 5.0
1, 6.0
3, 5.0
2, 2.0
2, 2.0
1, 2.0
我想获得如下表格:

ID | x | x_agg
1, 2, 21
2, 3, 14
3, 4, 11
4, 3, 10
其中
x
表示包含重合ID的所有行的总和。本质上,这就是我想要实现的计算:

第1行-->2+5+6+6+2=21

第2行-->3+5+2+2+2=14

第3行-->4+2+5=11

第4行-->3+2+5=10

我在QGIS中的DBManager中使用sqlite(通过spatialite)。以上是我炮制的一个有限的工作示例,但应该复制我工作的条件。我想出了以下代码:

 select
  table1.ID,
  ifnull(table1.x,0) as x,
  SUM(ifnull(table2.x,0)) +SUM(ifnull(table3.x,0))+ifnull(table1.x,0) as x_agg
from
 table1
  left join table2 on table1.ID = table2.join_ID
  left join table3 on table1.ID = table3.join_ID
group by
  ID;
但是,你可以得到:

ID  x   x_agg
1   2.0 40.0
2   3.0 25.0
3   4.0 11.0
4   3.0 10.0

当我运行上面的程序时。我做错了什么

这里最简单的方法可能是连接两个单独的子查询,分别聚合第二个表和第三个表:

SELECT
    t1.ID,
    t1.x,
    COALESCE(t2.sum_x, 0) + COALESCE(t3.sum_x, 0) AS x_agg
FROM table1 t1
LEFT JOIN
(
    SELECT join_ID, SUM(x) AS sum_x
    FROM table2
    GROUP BY join_ID
) t2
    ON t1.ID = t2.join_ID
LEFT JOIN
(
    SELECT join_ID, SUM(x) AS sum_x
    FROM table3
    GROUP BY join_ID
) t3
    ON t1.ID = t3.join_ID;

请注意,我在这两个位置都使用左连接,因为第一个表中给定的
ID
可能不会出现在其他两个表中。在这种情况下,有效和应被视为零。

这里最简单的方法可能是连接到两个单独的子查询,分别聚合第二个表和第三个表:

SELECT
    t1.ID,
    t1.x,
    COALESCE(t2.sum_x, 0) + COALESCE(t3.sum_x, 0) AS x_agg
FROM table1 t1
LEFT JOIN
(
    SELECT join_ID, SUM(x) AS sum_x
    FROM table2
    GROUP BY join_ID
) t2
    ON t1.ID = t2.join_ID
LEFT JOIN
(
    SELECT join_ID, SUM(x) AS sum_x
    FROM table3
    GROUP BY join_ID
) t3
    ON t1.ID = t3.join_ID;

请注意,我在这两个位置都使用左连接,因为第一个表中给定的
ID
可能不会出现在其他两个表中。在这种情况下,有效和应被视为零。

这个如何,它将所有表的和添加到外部SELECT的行部分,而不进行任何连接

SELECT id
     , ifnull(x, 0) as x
     , ifnull(x, 0)
         + (SELECT total(x) FROM table2 AS t2 WHERE t1.id = t2.join_id)
         + (SELECT total(x) FROM table3 AS t3 WHERE t1.id = t3.join_id) AS x_agg
FROM table1 AS t1
ORDER BY id;
id          x           x_agg     
----------  ----------  ----------
1           2           21.0      
2           3           14.0      
3           4           11.0      
4           3           10.0      
  • sum()
    vs
    total()
    :两者都返回所有非空值的总和,但是
    sum()
    返回空值,并且
    total()
    在每个值都为空的情况下返回0.0

使用以下数据(注意使用索引来改进相关子查询):


那么这个呢,它将所有表的总和都添加到外部SELECT的行部分,而不进行任何连接

SELECT id
     , ifnull(x, 0) as x
     , ifnull(x, 0)
         + (SELECT total(x) FROM table2 AS t2 WHERE t1.id = t2.join_id)
         + (SELECT total(x) FROM table3 AS t3 WHERE t1.id = t3.join_id) AS x_agg
FROM table1 AS t1
ORDER BY id;
id          x           x_agg     
----------  ----------  ----------
1           2           21.0      
2           3           14.0      
3           4           11.0      
4           3           10.0      
  • sum()
    vs
    total()
    :两者都返回所有非空值的总和,但是
    sum()
    返回空值,并且
    total()
    在每个值都为空的情况下返回0.0

使用以下数据(注意使用索引来改进相关子查询):


似乎有用。。。
COALESCE
IFNULL
之间有什么区别?为什么在这里使用
COALESCE
而不是
IFNULL
?@user32882 SQLite中
IFNULL
COALESCE
之间的唯一区别是前者只接受两个参数,而后者接受两个以上的参数。在我的查询中,您可以将
COALESCE
替换为
IFNULL
,结果也一样。这很公平。接受。这给了我不同于OP想要的
x_agg
列的结果。@Shawn同意,但我不知道聚合的逻辑是什么。似乎有效。。。
COALESCE
IFNULL
之间有什么区别?为什么在这里使用
COALESCE
而不是
IFNULL
?@user32882 SQLite中
IFNULL
COALESCE
之间的唯一区别是前者只接受两个参数,而后者接受两个以上的参数。在我的查询中,您可以将
COALESCE
替换为
IFNULL
,结果也一样。这很公平。接受。这给了我不同于OP想要的
x_agg
列的结果。@Shawn同意,但我不知道聚合的逻辑是什么。同样,似乎也可行,您如何处理空值?t1、t2和t3中的所有空值都需要被视为具有0@user32882如果您必须处理空值,请在问题中明确提及这一点,以及使用它们的一些示例行。。。但是,将更新。@user32882已完成。看起来也可以,您将如何处理空值?t1、t2和t3中的所有空值都需要被视为具有0@user32882如果您必须处理空值,请在问题中明确提及这一点,以及使用它们的一些示例行。。。但将进行更新。@user32882已完成。