复杂SQLite连接

复杂SQLite连接,sqlite,Sqlite,我有一个带有3个字段的表(tbl):id、日期和状态。表中的示例信息可能如下所示: id date status 1 8-20 open 2 8-20 open 3 8-20 closed 4 8-21 closed 5 8-22 open 6 8-23 open 7 8-24 closed date open closed 8-20 2 1 8-21 0 1 8-22 1 0 8-23 1 0 8-24 0 1 我想编写一个查询,返回如下数据:

我有一个带有3个字段的表(tbl):id、日期和状态。表中的示例信息可能如下所示:

id date status
 1 8-20 open
 2 8-20 open
 3 8-20 closed
 4 8-21 closed
 5 8-22 open
 6 8-23 open
 7 8-24 closed
date open closed
8-20 2    1
8-21 0    1
8-22 1    0
8-23 1    0
8-24 0    1
我想编写一个查询,返回如下数据:

id date status
 1 8-20 open
 2 8-20 open
 3 8-20 closed
 4 8-21 closed
 5 8-22 open
 6 8-23 open
 7 8-24 closed
date open closed
8-20 2    1
8-21 0    1
8-22 1    0
8-23 1    0
8-24 0    1
我能得到的最接近的结果是将两个联合选择包装在另一个选择中,如下所示:

select date from (
select date, count(id) from tbl where status = 'open' group by date
union
select date, count(id) from tbl where status = 'closed' group by date)
group by date

如果不是SQLite来解释其中一个状态有0个条目的日期,我认为这将涉及一个完整的外部联接,但我不知道如何构造两个左联接以获得所需的结果。

运行以下查询:

select date, sum(case when status ='open' then 1 else 0 end) as open from test group by date


并对closed执行相同操作。

您可以使用相关子查询:

SELECT date,
       (SELECT COUNT(*)
        FROM tbl AS t2
        WHERE t2.date = tbl.date
         AND status = 'open'
       ) AS open,
       (SELECT COUNT(*)
        FROM tbl AS t2
        WHERE t2.date = tbl.date
         AND status = 'closed'
       ) AS closed
FROM tbl
或者,按日期分组,并计算组中有多少行具有所需状态:

SELECT date,
       total(status = 'open') AS open,
       total(status = 'closed') AS closed
FROM tbl
GROUP BY date

第二个查询正确地提取了数据。谢谢