我正在使用具有表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/