SQL:在已分组的表上使用CASE

问题描述 投票:1回答:1

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

目标是创建一个表,该表将汇总日期范围(D1至D2)中的Kms,如果它们在X之上,则将它们标记为'High Kms';如果在Y之下,则将其标记为'Low 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”。

有人可以帮我确切地了解在编译为功能方面发生了什么吗?以及是否可行

任何建议将不胜感激。

我正在使用具有表CarUse的SQLite数据库,该表具有三个字段CarID(VARCHAR(20)),tDate(VARCHAR(20)和Kms(INT)。目标是创建一个表来汇总Kms以上...

sql sqlite group-by case
1个回答
0
投票

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

 CASE
      WHEN A.TotalDist > 50 THEN 'High Kms' 
      WHEN A.TotalDist < 10 THEN 'Low Kms'
   END
© www.soinside.com 2019 - 2024. All rights reserved.