【问题标题】:Using CASE to set a condition for COUNT statement in SQLite使用 CASE 为 SQLite 中的 COUNT 语句设置条件
【发布时间】:2020-02-08 07:38:25
【问题描述】:

我在 SQLite 中有一个 SELECT 语句,我需要在其中找到过去一年中每人注册的车辆数量。这是查询:

SELECT
p.fname,
p.lname,
p.bdate,
p.bplace,
COUNT(
  DISTINCT CASE r.vin WHEN r.regdate >= date('now', '-1 years') THEN 1 ELSE null END
),
COUNT(DISTINCT(t.violation))
FROM
persons p
LEFT JOIN registrations r ON p.fname = r.fname
AND p.lname = r.lname
LEFT JOIN tickets t ON r.regno = t.regno
GROUP BY
p.fname,
p.lname,
p.bdate,
p.bplace;

问题在于 CASE 语句,它没有检测到条件何时为真,并将我的所有值默认为 0。我该如何解决这个问题,或者有其他方法可以在 COUNT 语句中指定条件

【问题讨论】:

  • 尝试将ELSE null 更改为ELSE 0
  • @daShier 不,这不起作用,因为 count 语句将 0 计为一个值并将不需要的行也加起来,它需要为 null,因此 COUNT 不计算它
  • 它将r.vinr.regdate >= date('now', '-1 years') 的结果进行比较,这似乎不太可能是您想要或工作的结果。

标签: sql sqlite count case


【解决方案1】:

你可以使用FILTER(SQLite 3.30.0):

SELECT
   p.fname, p.lname, p.bdate, p.bplace,
   COUNT(DISTINCT r.vin) FILTER (WHERE r.regdate >= date('now', '-1 years')),
   COUNT(DISTINCT(t.violation))
FROM persons p
LEFT JOIN registrations r ON p.fname = r.fname
  AND p.lname = r.lname
LEFT JOIN tickets t ON r.regno = t.regno
GROUP BY p.fname, p.lname, p.bdate,p.bplace;

【讨论】:

  • 酷。我没有意识到 SQLite 支持filter
  • @GordonLinoff 是的,他们最近添加了对聚合的 FILTER 支持(2019-10-04)
  • 可能应该提到这需要一周前发布的 sqlite 3.30 才能工作。
【解决方案2】:

我猜你想要这个:

COUNT(DISTINCT CASE WHEN r.regdate >= date('now', '-1 years') THEN r.vin END)

因为COUNT(DISTINCT 1) 没有意义。
不需要ELSE null

【讨论】:

  • 我必须在前面添加一个 DISTINCT 才能获得我需要的结果,但是谢谢!我知道我的案例格式错误,我正在结合我在不同的 stackoverflow 论坛上阅读的内容,但是是的,这有效,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多