sql-server - 在 Case 中使用 Where 子句进行比较
问题描述
我是 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;
我想做的是:
- 选择表 A 中的 id 和 cAvg 列。
- 将表 A 中的 cAvg 与表 B 中的 Cr 进行比较。
- 使用 CASE 中的比较来选择满足条件的特定行。
- 使用选定的行给出查询结果。
t.Model 是表 B 的一列。我想在 case 语句中选择所选行的 t.Model 值。
我觉得方法是以某种方式在 CASE 的 When 中包含相当于 where 子句的内容。
需要指导!!
表架构:
表 A:
+----+------+
| id | cAvg |
+----+------+
| 1 | .8 |
| 2 | 5.4 |
| 3 | 6.0 |
+----+------+
表 B:
+-----+-------+
| Cr | Model |
+-----+-------+
| 2 | M1 |
| 5.5 | M2 |
| 8 | M3 |
+-----+-------+
我想要以下内容:
- 将 cAvg 的值与条件进行比较 =>(cAvg<=8 和 cAvg>=5.5 => 选择的模型必须是 M3。)
我想要得到的结果是:
+----+------+-------+
| id | cAvg | Model |
+----+------+-------+
| 1 | .8 | M1 |
| 2 | 5.4 | M2 |
| 3 | 6.0 | M3 |
+----+------+-------+
我厌倦了按照评论中的建议加入,非常感谢,因此我学到了很多东西!!
我的问题是没有共同的列可以加入。我还需要将一个表中的列与另一个表中的列进行比较,然后根据比较给出结果。
我在堆栈溢出中提到了许多答案,但所有答案都是在有一个公共列的前提下进行的。
我尝试了以下方法:
- 内部联接
- 案例
我需要一个方向,我需要进入哪个方向。谢谢!!
解决方案
我找到了解决该问题的可能方法。
问题陈述:
比较两个没有公共列的表。
使用 CASE 中的比较来选择特定行。
T-SQL 不接受 CASE 中的 WHERE 子句。
我的工作:
- 在第二个表中添加一个新列。
- 将表 B 中的 id 分配给表 A 中的列。
- 使用分配的 id 在表 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 |
+-----+-----+-------+
查询分配 id 的:
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 |
+----+------+-------+
我的问题的目的是做上述事情。为此,我想在 CASE 中找到一个 WHERE 子句的等价物。
但是上述方法为我实现了解决方案。希望能帮助到你:)!
推荐阅读
- sql-server - Sql Server 班次报告与 4 班次
- python - 如何使用python从服务器读取本地PC中的文件
- android - Android为对象动画师设置百分比
- node.js - 如何在 ES6 类中扩展 Sequelize 4 模型?
- ruby-on-rails - 我无法安装我想要的 ruby 版本
- angular - 不上传 jquery.min.js 和 mathquill.js 文件?
- r - 在远程机器上运行 R 脚本
- nltk - 哪个是命名实体识别的最佳库?斯坦福核心 nlp , NLTK 还是其他?
- jquery - CSS 样式和 jQuery 事件不适用于 ajax 加载的 HTML
- python - 如何让 GIF 在窗口中移动并响应点击