让我们看一下下表
Name TIMESTAMP STATUS
Task1 01-01-2019 COMPLETE
Task1 01-01-2019 COMPLETE
Task2 01-01-2019 COMPLETE
Task3 02-01-2019 NOT COMPLETE
Task4 01-01-2019 COMPLETE
Task4 02-01-2019 COMPLETE
我想要的是这样的输出:
Date TaskName How many completed?
January Task1 2
January Task2 1
January Task3 0
January Task4 1
February Task1 0
February Task2 0
February Task3 0
February Task4 1
我在弄清楚如何将每个任务计数到特定日期时遇到麻烦。我的表有10多个任务,大约有10万行,它们需要按日期分组,以便我们可以看到每个月成功完成了多少任务。
select DateName(month, DateAdd(month, month([TIMESTAMP]),0)-1) as 'Month',
count(TaskName) as 'Total Processed'
from myTable
where YEAR([TIMESTAMP]) = 2019 and TaskName = 'Task1'
group by month([TIMESTAMP]);
到目前为止,我知道这将为我提供Task1在2019年每个月完成的总次数,但是我正在努力如何将每个任务及其各自的名称放入此输出表中。有人可以建议我如何进行吗?任何指导都很棒!
答案 0 :(得分:1)
您可以使用以下查询:
SELECT DATENAME(month,[Timestamp]), Name,
SUM(CASE WHEN [STATUS] = 'Completed' THEN 1 ELSE 0 END) as [Completed]
FROM Table1
GROUP BY DATENAME(month,[Timestamp]), Name
ORDER BY DATENAME(month,[Timestamp]), Name
SUM(CASE WHEN [STATUS] = 'Completed' THEN 1 ELSE 0 END)
将返回完成的任务答案 1 :(得分:0)
尝试一下。
select
case
when to_char(timestamp, 'MM') = '01' then 'January'
when to_char(timestamp, 'MM') = '02' then 'Febuary'
when to_char(timestamp, 'MM') = '03' then 'March'
when to_char(timestamp, 'MM') = '04' then 'April'
end as month,name, count(status)
from myTable
group by month,name
order by timestamp;
答案 2 :(得分:0)
使用cross join
生成行,然后使用left join
引入数据:
select m.mm, n.name,
sum(case when t.status = 'COMPLETE' then 1 else 0 end) as num_completed
from (values (convert(date, '2019-01-01'),
convert(date, '2019-02-01')
) m(mm) cross join
(select distinct name
from t
) n left join
t
on t.name = n.name and
t.timestamp >= m.mm and
t.timestamp < dateadd(month, 1, m.mm)
group by m.mm, n.name;