选择另一个相关列的总数为0的列

时间:2016-12-01 13:41:13

标签: sql-server

我有一个名为xDays的表,如下所示:

╔══════════════╦═════════════════════════╦═══════╗
║ Project_Name ║          Date           ║ Hours ║
╠══════════════╬═════════════════════════╬═══════╣
║ proj1        ║ 2010-03-03 00:00:00.000 ║     0 ║
║ proj1        ║ 2010-03-04 00:00:00.000 ║     0 ║
║ proj1        ║ 2010-03-05 00:00:00.000 ║     0 ║
║ proj2        ║ 2010-03-03 00:00:00.000 ║     1 ║
║ proj2        ║ 2010-03-04 00:00:00.000 ║     0 ║
║ proj2        ║ 2010-03-05 00:00:00.000 ║     0 ║
╚══════════════╩═════════════════════════╩═══════╝

我要做的是选择Project_Name列中Hours列的总0 proj1。在上面的示例中,select语句应返回hours,因为它的总proj2为0,而select sum(hours) as 'total', project_name From xDays group by project_name order by project_name 的总小时数为1.

我最接近的是:

0

这给了我一个表格,显示每个project_name的总小时数,显示某些project_names的总小时数 select sum(hours) as 'total', project_name From xDays where 'total' = convert(varchar(10), 0) group by project_name order by project_name` 。从这里开始,我尝试了一些不同的东西,然后得到一个

  

将varchar值转换为datatype int

时转换失败

错误或空结果。我试过的一些例子:

select sum(hours) as 'total', project_name
From xDays
where 'total' = 0
group by project_name
order by project_name

返回空结果。

Song

这会返回转换错误(无法将varchar total转换为int)。

我怎样才能使其正常工作?

4 个答案:

答案 0 :(得分:4)

您可以使用HAVING子句过滤汇总结果:

select sum(hours) as 'total'
From xDays
group by project_name
HAVING sum(hours) = 0
order by project_name

HAVING子句只能出现在GROUP BY子句之后,并且不能使用任何列别名

答案 1 :(得分:2)

尝试以下

Select Project_Name
 From  xDays
 Group By Project_Name
 Having Sum(Hours)=0

答案 2 :(得分:2)

假设您要报告的所有项目都在xDays表中,up button是最好的。

特殊情景/注意事项

如果有可能让A表中没有任何条目的项目,但您仍然希望返回这些条目(即,因为不在该表中,它'' s暗示他们没有花费任何时间)。

xDays

如果可能有负时数,并且您希望那些项目的总小时数等于零的项目(即负数取消正数):

select project_name
from Projects
where project_name not in
(
    select distinct project_name
    from xDays
    where xdays.hours != 0
)

答案 3 :(得分:1)

试试这个:

select project_name
from xDays
group by project_name
having sum(xdays.hours) = 0

您需要使用tha having子句根据总计

进行过滤