显示 2000 年 CAN、USA 和 MEX 的奖牌数。编写 CASE 语句以在输出数据集中显示国家的全名。 CAN:加拿大,USA:美利坚合众国和 MEX:墨西哥。根据勋章对数据进行排序。
如何通过显示三列来解决问题。我的回答是显示无效的关系运算符。答案中要固定什么?
假设数据集包含一个名为 Country 的列,其值为“CAN”、“USA”、“MEX”,以及一个名为 Medal 的列,其类型为 medal,下面是一个 SQL 语句,它将显示国家的全名并根据数据对数据进行排序勋章上:
选择 案例国家 当'可以'然后'加拿大' 当'美国'然后'美利坚合众国' 当'MEX'然后'墨西哥' 其他国家 结束为 Full_Country, 勋章 FROM 表名 按勋章订购;
将 table_name 替换为实际表的名称。此语句将返回包含两列的数据集:Full_Country(带有国家全名)和 Medal。 CASE 语句检查 Country 列的值并返回相应的全名。如果 Country 的值不是“CAN”、“USA”或“MEX”,则语句将返回 Country 的原始值。然后根据 Medal 列对数据集进行排序。
如果你的数据看起来像这里...
WITH
tbl (NOC, MEDAL) AS
(
Select 'USA', 'Gold' From Dual Union All
Select 'MEX', 'Silver' From Dual Union All
Select 'CAN', 'Gold' From Dual Union All
Select 'MEX', 'Bronze' From Dual Union All
Select 'USA', 'Gold' From Dual Union All
Select 'USA', 'Bronze' From Dual Union All
Select 'USA', 'Gold' From Dual
)
...如果你想计算一个国家赢得了多少特定奖牌,那么你可以使用 Count() Over() 分析函数,使用 DISTINCT 关键字来消除重复项。注意:在大型数据集的情况下,DISTINCT 可能会降低性能。
SELECT DISTINCT
Case When NOC = 'CAN' Then 'Canada'
When NOC = 'MEX' Then 'Mexico'
When NOC = 'USA' Then 'United States of America'
Else NOC
End "COUNTRY",
MEDAL "MEDAL",
Count(MEDAL) Over(Partition By NOC, MEDAL) "MEDAL_COUNT"
FROM tbl
ORDER BY Case MEDAL
WHEN 'Gold' THEN 1
WHEN 'Silver' THEN 2
Else 3
End
--
-- R e s u l t :
COUNTRY MEDAL MEDAL_COUNT
------------------------ ------ -----------
United States of America Gold 3
Canada Gold 1
Mexico Silver 1
Mexico Bronze 1
United States of America Bronze 1
如果你想计算每个国家的奖牌总数,那么:
SELECT Case When NOC = 'CAN' Then 'Canada'
When NOC = 'MEX' Then 'Mexico'
When NOC = 'USA' Then 'United States of America'
Else NOC
End "COUNTRY",
Count(MEDAL) "TOTAL_MEDALS"
FROM tbl
GROUP BY NOC
ORDER BY Count(MEDAL) DESC
--
-- R e s u l t :
COUNTRY TOTAL_MEDALS
------------------------ ------------
United States of America 4
Mexico 2
Canada 1