Использование условия Where в Case для сравнения - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в T-sql.

Я использую следующий запрос:

SELECT e.Id,e.cAvg,
CASE 
    WHEN e.cAvg<=0.8 and cAvg>=0 THEN t.Model when t.Cr='0.8' then t.Model 
    WHEN e.cAvg>0.8 and cAvg<=5.4 THEN t.Model WHEN t.Cr='5.4' then t.Model 
    WHEN e.cAvg>5.4 and cg<=8 THEN t.Model WHEN t.Cr='8' then t.Model 
    ELSE 'No Change Required'
  END
  from A e, B t;

Я пытаюсь сделать следующее:

  • Выберите столбцы id и cAvg в таблице A.
  • Сравните cAvg в таблице A с Cr в таблице B.
  • Используйте сравнение в CASE, чтобы выбрать конкретную строку, которая удовлетворяет условию.
  • Используйте выбранную строку для выдачи результатов запроса.

t.Model - это столбец таблицы B. Я хочу выбрать значение t.Model для выбранной строки в операторе case.

Я чувствую, что путь состоит в том, чтобы каким-то образом включить эквивалент выражения where в When of CASE.

Need Direction !!

Схема таблицы:

TableA:

+----+------+
| id | cAvg |
+----+------+
|  1 | .8   |
|  2 | 5.4  |
|  3 | 6.0  |
+----+------+

Таблица B:

+-----+-------+
| Cr  | Model |
+-----+-------+
| 2   | M1    |
| 5.5 | M2    |
| 8   | M3    |
+-----+-------+

Я хочу следующее:

  • Сравните значения cAvg с условием => (cAvg<= 8 And cAvg> = 5.5 => выбранная модель должна быть M3.)

Результат, который я хочу получить:

+----+------+-------+
| id | cAvg | Model |
+----+------+-------+
|  1 | .8   | M1    |
|  2 | 5.4  | M2    |
|  3 | 6.0  | M3    |
+----+------+-------+

Я устал Присоединиться, как предложено вкомментарии, Абольшое спасибо, я многому научился благодаря этому !!.

Моя проблема в том, что нет общих столбцов для присоединения.Также мне нужно сравнить столбец в одной таблице с столбцом в другой таблице, а затем дать результат, основанный на сравнении.

Я сослался на многие ответы в переполнении стека, но все ответы для предпосылки, где естьобщий столбец.

Я попробовал следующее:

  • Внутреннее соединение
  • Случаи

Мне нужно направление, в каком направленииМне нужно войти в.Спасибо !!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Я нашел возможное решение этой проблемы.

Постановка задачи:

  • Сравнить две таблицы без общего столбца.

  • Использовать сравнениев CASE для выбора конкретной строки.

  • Предложение WHERE внутри CASE не принимается в T-SQL.

Моя работаВокруг:

  • Добавить новый столбец во второй таблице.
  • Назначить идентификатор из таблицы B столбцу в таблице A.
  • Использоватьназначенный идентификатор для выбора требуемой строки в таблице B.

Таблицы:

Таблица A:

+----+------+                           
| id | cAvg |
+----+------+
|  1 | .8   |
|  2 | 5.4  |
|  3 | 6.0  |
+----+------+

Таблица B

+-----+-----+-------+
| Bid | Cr  | Model |
+-----+-----+-------+
| 1   | 2   | M1    |
| 2   | 5.5 | M2    |
| 3   | 8   | M3    |
+-----+-----+-------+

Запрос на присвоение идентификаторов:

CREATE VIEW [AssignIDView] AS
SELECT DISTINCT e.id,
       e.cAvg,
       (CASE 
            WHEN e.cAvg>=0 and e.cAvg<=2 THEN 1
            WHEN e.cAvg>2 and e.cAvg<=5.5 THEN 2
            WHEN e.cAvg>3 and e.cAvg<=8 THEN 3


        ELSE 'Invalid'
       END) As BId
FROM A e, B t;

Результатом вышеупомянутого запроса будет представление следующим образом:

+----+------+-----+
| id | cAvg | Bid |
+----+------+-----+
|  1 | .8   |   1 |
|  2 | 5.4  |   2 |
|  3 | 6.0  |   3 |
+----+------+-----+

Теперь используйте Bid, чтобы выбрать строки из таблицы B, чтобы назначить модель изB:

Запрос:

 CREATE VIEW [ModelAssignView] AS
 select e.id,
   e.cAvg,
   t.Model as [Model]
 FROM A e, B t where e.TierID = t.id;

Результат запроса будет следующим:

+----+------+-------+
| id | cAvg | Model |
+----+------+-------+
|  1 | .8   |   M1  |
|  2 | 5.4  |   M2  |
|  3 | 6.0  |   M3  |
+----+------+-------+

Цель моего вопроса состояла в том, чтобы выполнить вышеизложенное.Для этого я хотел найти Эквивалент предложения WHERE внутри CASE.

Но вышеупомянутый метод помог мне.Надеюсь, это поможет:)!

0 голосов
/ 24 октября 2018

Во-первых, вы выбираете из 2 таблиц, но без каких-либо ограничений ссылок, поэтому все строки сравниваются

Если между таблицами есть совпадающий ключ, то сравниваются только соответствующие пары строк., он должен быть использован в операторе JOIN:

A e JOIN B t ON e.id = t.id

2-й из всех, чтобы выбрать соответствующие строки, вы должны решить, что это такое. вы можете внутри оператора WHERE определить, какие из них часто встречаются

WHERE
e.cAvg > 12

Вы можете использовать оператор case внутри WHERE, но тогда результат должен быть обусловлен, возвращаются TRUE

SELECT e.Id,e.cAvg, t.Model

 A e JOIN B t ON e.id = t.id

WHERE 
CASE WHEN e.cAvg<=6 THEN t.Model when t.Cr=6 then t.Model
WHEN e.cAvg>6 and e.cAvg<=12 THEN t.Model
WHEN t.Cr='12' then t.Model
WHEN e.cAvg>12 and cg<=24 THEN t.Model
WHEN t.Cr='24' then t.Model
ELSE -1 END ! = -1

EDIT

СледующийВы задаете вопрос о редактировании, я думаю, что вам нужен JOIN с условием. По сути, вместо объединения таблиц с одинаковым ключом соедините их неравным ключом.

Поскольку вы ищете cAvgМежду т.Cr строк, требуется 2 JOIN

SELECT e.Id,e.cAvg, t.Model
   FROM
     A e JOIN B t ON
e.cAvg >= t.Cr
     JOIN B t2 ON
e.cAvg < t2.Cr
WHERE
t.Cr IS NOT NULL
AND t2.Cr IS NOT NULL

Идея состоит в том, что только при выполнении 2 условий вы получите результаты e Hope, которая помогает

...