将指令与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

我有一个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  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;