将指令与SQLite中的子查询相结合
我有一个SQLite表,如下所示:将指令与SQLite中的子查询相结合,sql,database,sqlite,subquery,Sql,Database,Sqlite,Subquery,我有一个SQLite表,如下所示: ID_TABLE POINTS_A_TABLE POINTS_B_TABLE id number id_a points_a id_b points_b -------------- ---------------- ---------------- smith 1 smith 11 smith 25 gordon
ID_TABLE POINTS_A_TABLE POINTS_B_TABLE
id number id_a points_a id_b points_b
-------------- ---------------- ----------------
smith 1 smith 11 smith 25
gordon 22 gordon 11 gordon NULL
butch 3 butch 11 butch 26
sparrow 25 sparrow NULL sparrow 44
white 76 white 46 white NULL
使用以下命令
SELECT id,
avg(points_a)
FROM (SELECT id_a AS id, points_a FROM points_a_table
UNION ALL
SELECT id_b AS id, points_b FROM points_b_table)
GROUP BY id
ORDER BY avg(points_a) DESC;
我能得到每个名字的平均分数
现在,我想将结果列id与id_TABLE.number小于26的id_表中相应的columnnumber进行匹配。结果应为数字|平均值:
76 46.0[46+0/2]
如何通过将新指令与以前的指令组合在一起,在一个查询中完成这些操作?将原始查询用作子查询,这看起来很简单。这不是你想要的吗
SELECT
idt.number,
avg_points
FROM
id_table AS idt
INNER JOIN (
SELECT id,
avg(points_a) AS avg_points
FROM (SELECT id_a AS id, points_a FROM points_a_table
UNION ALL
SELECT id_b AS id, points_b FROM points_b_table)
GROUP BY id
) as x on x.id=idt.id
WHERE
idt.number < 26;
这看起来很简单,将原始查询用作子查询。这不是你想要的吗
SELECT
idt.number,
avg_points
FROM
id_table AS idt
INNER JOIN (
SELECT id,
avg(points_a) AS avg_points
FROM (SELECT id_a AS id, points_a FROM points_a_table
UNION ALL
SELECT id_b AS id, points_b FROM points_b_table)
GROUP BY id
) as x on x.id=idt.id
WHERE
idt.number < 26;
您需要进行一次连接,然后稍微修改分组以保持聚合函数正常工作。假设对于点a或点b中的每个对应记录,id_表中只有一条记录:
您需要进行一次连接,然后稍微修改分组以保持聚合函数正常工作。假设对于点a或点b中的每个对应记录,id_表中只有一条记录:
SELECT
idt.number,
avg_points
FROM
id_table AS idt
INNER JOIN (
SELECT id,
avg(points_a) AS avg_points
FROM (SELECT id_a AS id, points_a FROM points_a_table
UNION ALL
SELECT id_b AS id, points_b FROM points_b_table)
GROUP BY id
) as x on x.id=idt.id
WHERE
idt.number < 26;
SELECT i.number,
avg(pts.points) AS average_points
FROM (SELECT id_a AS id, points_a AS points FROM points_a_table
UNION ALL
SELECT id_b AS id, points_b AS points FROM points_b_table) AS pts
INNER JOIN id_table i ON i.id = pts.id
GROUP BY pts.id, i.number
WHERE i.number < 26
ORDER BY avg(pts.points) DESC;