2017-04-02 65 views
0

我正在尝试运行一个报告,查看上个月有多少辆车需要维修,需要维修多少辆。如下图所示,如果一辆车已经修理过,它有一个1分配给它,否则,它是0.这是我目前的尝试,它返回我不想要的1和0。任何帮助深表感谢。如何在SQL中只计数1?

Table

select 
    vehicles_inspections.Vehicle_ID, 
    make, 
    model, 
    count(Repair), 
    count(Service) 
from vehicles_inspections, vehicles 
where vehicles.Vehicle_ID = vehicles_inspections.Vehicle_ID 
group by Vehicle_ID 

回答

3

与已显示的数据,你可以简单地使用sum()而不是count()

select vi.Vehicle_ID, v.make, v.model, sum(vi.Repair), sum(vi.Service) 
from vehicles v join 
    vehicles_inspections vi 
    on v.Vehicle_ID = vi.Vehicle_ID 
group by vi.Vehicle_ID, v.make, v.model; 

这工作,因为这些值似乎是要么01。换句话说,这些列被设计为可以为此目的进行总结的标志。

如果他们可以采取其他值,你会使用类似:

sum(case when repair = 1 then 1 else 0 end) as repairs 

注:

  • 你应该有资格所有列名。我在猜测列的来源。
  • 从不FROM条款中使用逗号。 始终使用使用正确的,明确的JOIN语法。
+0

嘿工作完美的人谢谢,只是想知道为什么我应该永远不会使用逗号我只开始使用SQL最近我从来没有使用它们的牧群? –

+1

@leonHill。 。 。它们是古老的,过时的语法 - 并且已经过去几十年了。正确的语法是明确的'JOIN's。这是更强大和标准(两个主要原因)。另外,几乎每个人都发现,在连接条件与表引用相关的查询后面,查询变得更加容易,而不是混入'WHERE'子句中。如果您正在学习SQL,那么学习“JOIN”以进行“连接”会更有意义,然后学习“*逗号*”作为“连接”。 –

+0

非常感谢,我现在开始使用连接而不是逗号。感谢你的帮助 –

0

这是现有的where子句:

where vehicles.Vehicle_ID = vehicles_inspections.Vehicle_ID 

为了该条款,补充一点:

and repair_service_complete = 0 
and repair = 1 

或任何类似的过滤器实现您的业务需求。