2017-04-25 60 views
0

我正在为某些计数编写select语句。SQL选择查询出现问题

这样:

Select JobType, count(JobType) as count from PrintJobs with (nolock) 
where JobType in (1, 2, 3, 4) 
and convert(datetime, TimeSubmitted) > cast(CAST(dateadd(dd, -1,GETDATE()) as date) as datetime) + CAST('17:30:00.000' as time) 
group by JobType 

的问题是,当什么也不显示了JobTypes表看起来像这样

JobTypes | count | 
------------------| 
    2  1 | 
    3  2 | 
__________________| 

有没有办法让它像这样:

JobTypes | count | 
------------------| 
    1  0 | 
    2  1 | 
    3  2 | 
    4  0 | 
__________________| 

这样即使工作类型的结果中没有任何结果,它仍然显示出来吗?我试图使这一动态地在jobtypes可以在C#中的SQL参数设定的时间提前

感谢

+0

你有一个JobType列表吗? –

+0

你在使用什么平台? – Hogan

+0

我没有任何类型的表格,但我总是可以从用户的参数中创建它。我试图将其转换为存储过程并在C#中运行它。我比C#更熟悉C#,所以它会导致一些问题 –

回答

1

一种解决方案是left join

Select j.JobType, count(pj.JobType) as count 
from (values (1), (2), (3), (4)) j(jobtype) left join 
    PrintJobs pj 
    on pj.JobType = j.jobType and 
     convert(datetime, TimeSubmitted) > cast(CAST(dateadd(day, -1,GETDATE()) as date) as datetime) + CAST('17:30:00.000' as time) 
group by j.JobType 
+0

到目前为止,这是最好的答案,唯一的问题是当jobtype结果为0时,我回来的表显示为1而不是0 –

+0

@MatthewSehorn。 。 。有一个错字。正确的'count()'是'count(pj.jobtype)'。 –

1

在SQL Server像这个:

Select JTS.JobType, count(*) as count 
from (
    SELECT 1 as JT 
    UNION ALL 
    SELECT 2 as JT 
    UNION ALL 
    SELECT 3 as JT 
    UNION ALL 
    SELECT 4 as JT 
) AS JTS 
LEFT JOIN PrintJobs AS P with (nolock) ON P.JobType = JTS.JT 
     AND convert(datetime, P.TimeSubmitted) > cast(CAST(dateadd(dd, -1,GETDATE()) as date) as datetime) + CAST('17:30:00.000' as time) 
group by P.JobType 

在这里你创建一个类型和连接的表。

+0

我遇到了与此相同的问题...如果结果为空,表格为空白。即使值为0,Gordon Linoff的答案也给了我一张表格,其中的工作类型即使值为0.他唯一的问题是,如果工作类型的结果为0,他的表格会将其显示为1 –

+0

@MatthewSehorn您需要说平台 - 我的是SQL服务器他是oracle/db2 – Hogan

+0

@MatthewSehorn - 是的,我看到问题将'WHERE'更改为'AND' - 标准需要成为左连接的一部分。看到? – Hogan

1
Select JTypes.JType, count(P.JobType) as count 
from (
SELECT 1 as JType 
UNION ALL 
SELECT 2 as JType 
UNION ALL 
SELECT 3 as JType 
UNION ALL 
SELECT 4 as JType 
) AS JTypes 
    LEFT JOIN PrintJobs AS P ON P.JobType = JTypes.JType 
    WHERE convert(datetime, P.TimeSubmitted) > cast(CAST(dateadd(dd, -1,GETDATE()) as date) as datetime) + CAST('17:30:00.000' as time) 
group by JTypes.JType 
+0

我遇到与此相同的问题...如果结果为空,表格为空白。 Gordon Linoff的答案给了我一个表格,其中的工作类型即使值为0.他唯一的问题是,如果工作类型的结果为0,他的表格会显示它为1 –

+0

@MatthewSehorn,如果没有值在PrintJobs表中,您的预期输出是什么? –

+0

0将是我正在寻找的答案。如果你看看我的问题中的两个示例表,第一个显示了我目前正在获取哪些只是printjobs有一个计数的行。我正在寻找的第二个表格将printjobs显示为0,它的值为0.希望这是有道理的! –