我正在使用具有表CarUse的SQLite数据库,该表具有三个字段CarID(VARCHAR(20)),tDate(VARCHAR(20)和Kms(INT))。

目标是创建一个表,该表将汇总日期范围(D1至D2)中的Kms,如果它们在X上方,则将其标记为“高Kms”,如果在Y之下,则将其标记为“低Kms”。

因此,逐步构建此步骤,我可以使用GROUP BY命令在CarUse表中轻松找到每辆汽车的总Kms:

SELECT CarID, SUM(Kms)
FROM CarUse
WHERE tDate > D1 AND tDate < D2
GROUP BY CarID


现在,基本上我想做的是创建另一个字段以添加到对SUM(Kms)进行分类的结果数据中,以便如果SUM(Kms)> X为'High Kms',而
首先我尝试了:

SELECT CarID, SUM(Kms) AS A,
   CASE A
      WHEN A > X THEN 'High Kms'
      WHEN A < Y THEN 'Low Kms'
   END
FROM CarUse
WHERE tDate > D1 AND tDate < D2
GROUP BY CarID


当我运行它时,我得到一个错误,说'没有这样的列:A'。我首先想到的是,在创建结果后必须分配别名“ A”。作为快速解决方案,我希望如果不使用别名A,而是引用SUM(Kms),即

SELECT CarID, SUM(Kms),
   CASE SUM(Kms)
      WHEN  SUM(Kms) > X THEN 'High Kms'
      WHEN  SUM(Kms) < Y THEN 'Low Kms'
   END
FROM CarUse
WHERE tDate > D1 AND tDate < D2
GROUP BY CarID


这会执行,但不会执行所需的结果。实际上,它仅将“高Kms”分配给SUM(Kms)= 0的用户。在这里,我再次假定这是由于Sum(Kms)在运行时未知。

我决定尝试另一种策略并分别创建“ SUM表”,然后对它运行相同的查询,即

SELECT A.CarID, A.TotalDist,
   CASE A.TotalDist
      WHEN A.TotalDist > X THEN 'High Kms'
      WHEN A.TotalDist < Y THEN 'Low Kms'
   END
FROM (
   SELECT CarID, SUM(Kms) AS TotalDist
   FROM CarUse
   WHERE tDate > D1 AND tDate < D2
   GROUP BY CarID
) AS A


这会执行,但可惜没有执行所需的操作。它仅向A.TotalDist = 0的那些分配“ High Kms”。

有人可以帮助我确切地了解功能编译方面的情况吗?以及这是否可能

任何建议将不胜感激。

最佳答案

这是由于您的case,应该是这样的:

 CASE
      WHEN A.TotalDist > 50 THEN 'High Kms'
      WHEN A.TotalDist < 10 THEN 'Low Kms'
   END


代替:

 CASE A.TotalDist
      WHEN A.TotalDist > 50 THEN 'High Kms'
      WHEN A.TotalDist < 10 THEN 'Low Kms'
   END


查询:

SELECT A.CarID, A.TotalDist,
   CASE
      WHEN A.TotalDist > 50 THEN 'High Kms'
      WHEN A.TotalDist < 10 THEN 'Low Kms'
   END High_Low
FROM (
   SELECT CarID, SUM(Kms) AS TotalDist
   FROM CarUse
   GROUP BY CarID
) AS A


Demo

关于sql - SQL:在已分组的TABLE上使用CASE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59855261/

10-10 19:18