首页 > 解决方案 > 在 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;

我想做的是:

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    |
+-----+-------+

我想要以下内容:

我想要得到的结果是:

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

我厌倦了按照评论中的建议加入,非常感谢,因此我学到了很多东西!!

我的问题是没有共同的列可以加入。我还需要将一个表中的列与另一个表中的列进行比较,然后根据比较给出结果。

我在堆栈溢出中提到了许多答案,但所有答案都是在有一个公共列的前提下进行的。

我尝试了以下方法:

我需要一个方向,我需要进入哪个方向。谢谢!!

标签: sql-servertsqlsql-server-2008casessms

解决方案


我找到了解决该问题的可能方法。

问题陈述:

  • 比较两个没有公共列的表。

  • 使用 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 子句的等价物。

但是上述方法为我实现了解决方案。希望能帮助到你:)!


推荐阅读