oracleI基础入门(11)case Crazy

CASE
CASE 是 SQL 用来做为 if-then-else 之类逻辑的关键字。 CASE 的语法如下:
SELECT CASE ("栏位名") WHEN "条件1" THEN "结果1" WHEN "条件2" THEN "结果2"...
[ELSE "结果N"]ENDFROM "表格名"
"条件" 可以是一个数值或是公式。 ELSE 子句则并不是必须的。
在我们的 Store_Information 中
Store_Information 表格
store_name                Sales                Date
Los Angeles               $1500                Jan-05-1999
San Diego                 $250                   Jan-07-1999
San Francisco            $300                  Jan-08-1999
Boston                      $700                   Jan-08-1999
若我们要将 'Los Angeles' 的 Sales 数值乘以2,以及将 'San Diego' 的 Sales 数值乘以1.5,
我们就键入以下的 SQL:
SELECT store_name, CASE store_name
WHEN 'Los Angeles' THEN Sales * 2
WHEN 'San Diego' THEN Sales * 1.5
ELSE Sales
END
"New Sales",
Date
FROM Store_Information
"New Sales" 是用到 CASE 那个栏位的栏位名。
结果:
store_name New Sales Date
Los Angeles $3000 Jan-05-1999
San Diego $375 Jan-07-1999
San Francisco $300 Jan-08-1999
Boston $700 Jan-08-1999
算排名
列出每一行的排名是一个常见的需求,可惜 SQL 并没有一个很直接的方式达到这个需求。
要以 SQL 列出排名,基本的概念是要做一个表格自我连结 (self join),将结果依序列出,
然后算出每一行之前 (包含那一行本身) 有多少行数。这样讲读者听得可能有点困惑,所以
最好的方式是用一个实例来介绍。假设我们有以下的表格:
Total_Sales 表格
Name Sales
John 10
Jennifer 15
Stella 20
Sophia 40
Greg 50
Jeff 20
要找出每一行的排名,我们就打入以下的 SQL 语句:
SELECT a1.Name, a1.Sales, COUNT(a2.sales) Sales_Rank
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC;
结果:
Name Sales Sales_Rank
Greg 50 1
Sophia 40 2
Stella 20 3
Jeff 20 3
Jennifer 15 5
John 10 6
我们先来看 WHERE 子句。在字句的第一部分 (a1.Sales <= a2.Sales),我们算出有多少笔资
料 Sales 栏位的值是比自己本身的值小或是相等。如果在 Sales 栏位中没有同样大小的资
料,那这部分的 WHERE 子句本身就可以产生出正确的排名。
子句的第二部分,(a1.Sales=a2.Sales and a1.Name = a2.Name),则是让我们在 Sales 栏位中
有同样大小的资料时 (像 Stella 及 Jeff 这两笔资料),仍然能够产生正确的排名。

原文地址:https://www.cnblogs.com/flyscan/p/2545964.html