Sqlite 将两个sql查询组合成一个分组
下面我有两个问题。现在我怎么能把它们组合在一张桌子上呢?也可以这样:Sqlite 将两个sql查询组合成一个分组,sqlite,Sqlite,下面我有两个问题。现在我怎么能把它们组合在一张桌子上呢?也可以这样: +-------+-----------------+----------------+ | Date | Tickets created | Tickets closed | +-------+-----------------+----------------+ | 10/25 | 50 | 45 | | 10/26 | 40 |
+-------+-----------------+----------------+
| Date | Tickets created | Tickets closed |
+-------+-----------------+----------------+
| 10/25 | 50 | 45 |
| 10/26 | 40 | 40 |
| 10/27 | 30 | 30 |
| 10/28 | 10 | 0 |
+-------+-----------------+----------------+
tickets表如下所示:
+----+----------------------+----------------------+------------------+
| id | created_at | closed_at | master_ticket_id |
+----+----------------------+----------------------+------------------+
| 1 | 2013-10-12 00:00:00' | 2013-10-12 06:00:00' | |
| 2 | 2013-11-11 00:00:00' | | |
| 3 | 2013-11-12 00:00:00' | | 2 |
| 4 | 2013-11-13 10:00:00' | 2013-11-13 12:00:00' | |
| 5 | 2013-12-12 00:00:00' | 2013-12-12 07:00:00' | |
+----+----------------------+----------------------+------------------+
问题1
选择strftime%m-%d,tickets.created_u2;as'Date',
counttickets.created_atas“Tickets created”
从票上
WHERE tickets.created_at>=“2013-10-01 00:00:00”
和门票。创建时间为<'2013-10-31 00:00:00'
和tickets.master\u ticket\u id为空
按strftime%m-%d分组,票证已创建\u于
产生:
+----+---------+
|日期|创建的票证|
+----+---------+
| 10/25 | 50 |
| 10/26 | 40 |
| 10/27 | 30 |
+----+---------+
问题2
选择strftime%m-%d,tickets.closed\u作为“日期”,
counttickets.closed_atas“Tickets closed”
从票上
WHERE tickets.closed_在>='2013-10-01 00:00:00'
和门票。截止时间为<'2013-10-31 00:00:00'
和tickets.master\u ticket\u id为空
按strftime%m-%d分组,票证已关闭\u
产生:
+----+--------+
|日期|门票关闭|
+----+--------+
| 10/25 | 50 |
| 10/26 | 40 |
| 10/27 | 30 |
+----+--------+
您可以尝试联接表,如:
SELECT *
FROM (query1) q1
LEFT JOIN (query) q2
ON q1.date = q2.date
但是mySql没有完全连接,结果也不会好。您必须使用组合左+右联接,结果是两个查询的并集
但请尝试以下未经测试的方法:
SELECT
strftime("%m-%d",`date`) AS `date`,
SUM(created) `created`,
SUM(closed)`closed`
FROM
(
SELECT
CASE
WHEN (tickets.created_at >= '2013-10-01 00:00:00' and tickets.created_at< '2013-10-31 00:00:00' and tickets.master_ticket_id is Null ) THEN created_at
WHEN (tickets.closed_at >= '2013-10-01 00:00:00' and tickets.closed_at< '2013-10-31 00:00:00' and tickets.master_ticket_id is Null) THEN closed_at
END AS `date` ,
CASE
WHEN (tickets.closed_at >= '2013-10-01 00:00:00' and tickets.closed_at< '2013-10-31 00:00:00' and tickets.master_ticket_id is Null) THEN 1
ELSE 0
END AS `closed`,
CASE
WHEN (tickets.created_at >= '2013-10-01 00:00:00' and tickets.created_at< '2013-10-31 00:00:00' and tickets.master_ticket_id is Null) THEN 1
ELSE 0
END AS `created`
FROM tickets
) AS results
Group by strftime("%m-%d",`date`)
[由于以前的版本有一些错误而编辑] 似乎要避免一个联盟比我希望的要困难得多,但据我所知,以下几点应该是可行的
SELECT Date, SUM(created) AS 'Tickets created', SUM(closed) AS 'Tickets closed' FROM
(
SELECT strftime("%m-%d",tickets.created_at) AS 'Date',
COUNT(tickets.created_at) AS 'created',
0 AS 'closed'
FROM tickets
WHERE tickets.created_at >= '2013-10-01 00:00:00'
AND tickets.created_at< '2013-10-31 00:00:00'
AND tickets.master_ticket_id IS NULL
GROUP BY Date
UNION ALL
SELECT strftime("%m-%d",tickets.closed_at) AS 'Date',
0 AS 'created',
COUNT(tickets.closed_at) AS 'closed'
FROM tickets
WHERE tickets.closed_at >= '2013-10-01 00:00:00'
AND tickets.closed_at< '2013-10-31 00:00:00'
AND tickets.master_ticket_id IS NULL
GROUP BY Date
)
GROUP BY Date
这个和我想要的很接近。唯一的问题是,当我将tickets.created_at和tickets.closed_at更改为本月12月的日期时,它仍然显示11月和10月等,尽管创建的tickets为0,关闭的tickets为0。啊,好吧,您可以在where子句中添加一个术语,以仅选择创建日期在特定日期之间的那些。或者可能是我们现在总结的两个术语中的一个或。嗯,我也是这么想的,但是当我在where语句后面添加了一行:AND tickets.created_at>='2013-12-01 00:00:00'和tickets.created_at<'2013-12-30 00:00:00'时,所有tickets.created AND tickets.closedHmm,实际上,如果是已关闭的票证,则日期不应基于创建的时间,对吗。我会仔细考虑一下。我得到了无效的SQL-没有这样的函数:如果Sqllite不支持IF语句??格式是正确的,只是它返回的值与我使用的原始查询相比略有偏差。我会试着看一看原因。我感谢你的帮助!我认为计数可能是关闭的,因为如果在给定的时间间隔内创建和关闭票据,则创建和关闭都将在创建日期计数,而不是在各自的日期计数。不幸的是,您没有提供示例数据和结构,并且不想自己创建它们。。。;我添加了票务表的外观