我想从MySQL数据库创建以下图表。我知道如何实际创建图表(使用excel或类似程序),我的问题是如何获取创建图表所需的数据。在这个例子中,我可以看到,在1月1日,60张门票处于绿线所示的状态。
我需要通过日期范围跟踪项目的门票的历史状态。日期范围由项目经理确定(在本例中为1月1日至1月9日)。
对于每张票,我都有以下一套历史数据。每次故障单中的某些更改(状态,描述,受理人,客户更新以及此问题中未显示的其他属性)时,都会在数据库中生成“timestamp”条目。
ticket_num status_changed_date from_state to_state 123456 2011-01-01 18:03:44 -- 1 123456 2011-01-01 18:10:26 1 2 123456 2011-01-01 14:37:10 2 2 123456 2011-01-02 07:55:44 2 3 123456 2011-01-03 06:12:18 3 2 123456 2011-01-04 19:03:43 3 3 123456 2011-01-05 02:05:24 3 4 123456 2011-01-06 18:13:28 4 4 123456 2011-01-07 13:14:48 4 5 123456 2011-01-09 01:35:39 5 5
如何在给定时间内查询数据库(由我的脚本确定)并找出每张票据的状态?
例如:要生成上面显示的图表,给定日期2011-01-02 12:00:00,状态为“2”的票数是多少?
我尝试使用特定日期和范围查询数据库,但无法确定获取数据以创建图表的正确方法。提前感谢您的帮助。
答案 0 :(得分:3)
我不确定我知道你想要什么。但是。 。
假设表定义如下:
create table ticket_data (ticket_num int,
status_changed_date datetime,
from_state int,
to_state int);
例如,以下内容将为您提供每天的值数:
select date(status_changed_date) as status_date, count(*)
from ticket_data
group by status_date;
现在,如果你只需要from_state = 2
,只需在其中添加一个where子句即可。如果您只想要1月2日的那些,那么请加入where date(status_changed_date) = '2011-01-02'
或者,如果您每天要查找不同数量的故障单,请将count(*)
更改为count(distinct ticket_num)
这就是你问的问题吗? SQL小提琴here
答案 1 :(得分:1)
好的,如果你想在特定时间获得特定状态的记录数,我认为存储过程可能是必要的。
CREATE PROCEDURE spStatesAtDate
@Date datetime,
@StateId int
AS
BEGIN
SET NOCOUNT ON;
SELECT COUNT(*) as Count
FROM ticket_table t1
WHERE to_state = @StateId AND status_changed_date < @Date
AND status_changed_date = (SELECT MAX(status_changed_date) FROM ticket_table t2 where t2.ticket_num=t1.ticket_num AND status_changed_date < @Date)
END
然后为上面的例子调用它,你的查询看起来像
EXEC spStatesAtDate @Date='2011-01-02 12:00:00', @StateId=2
答案 2 :(得分:1)
您可以使用子查询选择在按ticket_num分组的给定点之前的最后修改日期,然后在此时选择状态。
SELECT
ticket_num,
to_state,
status_changed_date
FROM
tickets
WHERE
status_changed_date IN (
SELECT MAX(status_changed_date)
FROM tickets
WHERE status_changed_date < '2012-02-01 01:00:00'
GROUP BY ticket_num
)
答案 3 :(得分:1)
这一切归结为常见问题:如何获取项目列表及其最新状态。所以。鉴于一个问题,我们可以通过查询获取其最新状态:
select to_state
from ticket_states
where ticket_num = t.ticket_num
order by status_changed_date desc
limit 1
接下来,我们需要获取所有适用的不同问题ID,这是一个简单的不同选择:
select distinct ticket_num from ticket_states
通过这两个子查询,我们已经可以开始构建了。例如,当前问题列表及其在指定日期之前的最新状态将为:
select t.ticket_num
, (select to_state
from ticket_states
where ticket_num = t.ticket_num
and status_changed_date <= '2012-01-01'
order by status_changed_date desc
limit 1) as last_state
from (select distinct ticket_num
from ticket_states) t;
所有在指定时间不存在的问题都会将last_state
设置为空。
这可能不是最好的方法,但首先想到的是这一点。我会留下其他东西给你。另外我应该提一下,这也不是一个非常有效的解决方案。