SQL: Использование CASE поверх TABLE, сгруппированного - PullRequest
3 голосов
/ 22 января 2020

Я работаю с базой данных SQLite, в которой есть таблица CarUse с тремя полями CarID (VARCHAR (20)), tDate (VARCHAR (20) и Kms (INT).

Цель состоит в том, чтобы создать таблица, которая будет суммировать Kms за диапазон дат (от D1 до D2), а затем помечать их как «High Kms», если они выше X, и как «Low Kms», если они меньше Y.

Итак, Построив этот шаг за шагом, я легко могу найти общее количество километров для каждой машины в таблице CarUse с помощью команды GROUP BY:

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) неизвестно, когда он работает.

Я решил попробовать другую тактику c и создать 'таблицу 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

Это выполняется, но, к сожалению, не сделать желаемое действие. Он назначает «Высокие Kms» только тем, где A.TotalDist = 0.

Может ли кто-нибудь помочь мне точно понять, что происходит с точки зрения компиляции с функциональностью? и возможно ли это

Любой совет будет принята с благодарностью.

1 Ответ

2 голосов
/ 22 января 2020

Это из-за вашего 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

Демо

...