繁体   English   中英

SQL - 了解如何根据名称在列中出现的次数编写案例语句

[英]SQL - Finding out how to write a case statement depending on how many times a name shows up in a column

我需要一些 SQL 练习的帮助,这让我完全被难住了。 对于一项作业,我有一个问题要求我打印一份名称列表,其中附有不同的描述,具体取决于它们在预先存在的列表中出现的次数。 问题逐字发布在下面以供参考:

SI 模式包含购买了一辆或多辆汽车的客户。 它们可以使用以下标准进行分类:

  • 仅购买一辆车的客户(一次性购买者)
  • 已购买两辆车的客户(两次购买者)
  • 购买两辆车以上的客户(常客)

使用 SINGLE SELECT 声明,显示客户列表及其姓名以及购买 Jaguar 汽车的所有客户的买家类型。

我写的代码贴在这里:

use si;

select saleinv.custname,
    count(case
    when saleinv.custname = 1
        then 'One-Time Purchaser'
    when saleinv.custname = 2
        then 'Two-Time Purchaser'
    else
        'Frequent Purchaser'
    
end) as "purchtype"
from si.saleinv

inner join si.car
on car.custname = saleinv.custname
where (car.carmake like 'JAGUAR');

这正是我目前所拥有的——我不断地取出东西、添加东西和重新排列东西——似乎没有任何效果。 我遇到一个又一个错误。 我一直在尝试遵循我能找到的任何 CASE 声明资源,包括我的导师提供给我的资源,但似乎没有任何帮助。 有很多资源详细说明了如何处理直接分配的值,但从来没有任何与我应该使用它来查找列表中出现的项目数量相关的内容。 不管我如何遵循示例代码,我的 IDE 只是不喜欢我输入的内容。

我不希望对我的代码进行任何彻底的更改,我只是希望有人指出我做错了什么,因为目前我一无所知。

我是 StackOverflow 的新手(就在网站上实际发布内容而言),所以我可能不知道如何浏览回复和帖子等,但我会尽力而为。

谢谢你们。

我将使用 R 的mtcars数据集进行演示。 cyl是一个合理的测试字段,因此我将其投影为您的“客户名称”。 示例的更改:我将使用值范围而不是简单的相等。

with counts as (
  select cyl, count(*) as n
  from mtcars
  group by cyl
)
select c.cyl, c.n,
  case when             c.n <= 8 then 'small'
       when 8 < c.n and c.n <= 12 then 'medium'
       when 12 < c.n then 'large'
  end as something
from counts c

 cyl  n something
   4 11    medium
   6  7     small
   8 14     large

我认为您打算将它重新加入一些数据,可能来自另一个表。 我只是将它自己重新加入(也许很奇怪),实际上是相同的方法。

with counts as (
  select cyl, count(*) as n
  from mtcars
  group by cyl
)
select mt.cyl, mt.disp, c.n,
  case when             c.n <= 8 then 'small'
       when 8 < c.n and c.n <= 12 then 'medium'
       when 12 < c.n then 'large'
  end as something
from mtcars mt
  inner join counts c on mt.cyl = c.cyl

 cyl  disp  n something
   6 160.0  7     small
   6 160.0  7     small
   4 108.0 11    medium
   6 258.0  7     small
   8 360.0 14     large
   6 225.0  7     small
   8 360.0 14     large
 ...truncated

(这是在 SQLite 中完成的,尽管它应该在其他 DBMS 中执行相同的操作。)


数据

"car","mpg","cyl","disp","hp","drat","wt","qsec","vs","am","gear","carb"
"Mazda RX4",21,6,160,110,3.9,2.62,16.46,0,1,4,4
"Mazda RX4 Wag",21,6,160,110,3.9,2.875,17.02,0,1,4,4
"Datsun 710",22.8,4,108,93,3.85,2.32,18.61,1,1,4,1
"Hornet 4 Drive",21.4,6,258,110,3.08,3.215,19.44,1,0,3,1
"Hornet Sportabout",18.7,8,360,175,3.15,3.44,17.02,0,0,3,2
"Valiant",18.1,6,225,105,2.76,3.46,20.22,1,0,3,1
"Duster 360",14.3,8,360,245,3.21,3.57,15.84,0,0,3,4
"Merc 240D",24.4,4,146.7,62,3.69,3.19,20,1,0,4,2
"Merc 230",22.8,4,140.8,95,3.92,3.15,22.9,1,0,4,2
"Merc 280",19.2,6,167.6,123,3.92,3.44,18.3,1,0,4,4
"Merc 280C",17.8,6,167.6,123,3.92,3.44,18.9,1,0,4,4
"Merc 450SE",16.4,8,275.8,180,3.07,4.07,17.4,0,0,3,3
"Merc 450SL",17.3,8,275.8,180,3.07,3.73,17.6,0,0,3,3
"Merc 450SLC",15.2,8,275.8,180,3.07,3.78,18,0,0,3,3
"Cadillac Fleetwood",10.4,8,472,205,2.93,5.25,17.98,0,0,3,4
"Lincoln Continental",10.4,8,460,215,3,5.424,17.82,0,0,3,4
"Chrysler Imperial",14.7,8,440,230,3.23,5.345,17.42,0,0,3,4
"Fiat 128",32.4,4,78.7,66,4.08,2.2,19.47,1,1,4,1
"Honda Civic",30.4,4,75.7,52,4.93,1.615,18.52,1,1,4,2
"Toyota Corolla",33.9,4,71.1,65,4.22,1.835,19.9,1,1,4,1
"Toyota Corona",21.5,4,120.1,97,3.7,2.465,20.01,1,0,3,1
"Dodge Challenger",15.5,8,318,150,2.76,3.52,16.87,0,0,3,2
"AMC Javelin",15.2,8,304,150,3.15,3.435,17.3,0,0,3,2
"Camaro Z28",13.3,8,350,245,3.73,3.84,15.41,0,0,3,4
"Pontiac Firebird",19.2,8,400,175,3.08,3.845,17.05,0,0,3,2
"Fiat X1-9",27.3,4,79,66,4.08,1.935,18.9,1,1,4,1
"Porsche 914-2",26,4,120.3,91,4.43,2.14,16.7,0,1,5,2
"Lotus Europa",30.4,4,95.1,113,3.77,1.513,16.9,1,1,5,2
"Ford Pantera L",15.8,8,351,264,4.22,3.17,14.5,0,1,5,4
"Ferrari Dino",19.7,6,145,175,3.62,2.77,15.5,0,1,5,6
"Maserati Bora",15,8,301,335,3.54,3.57,14.6,0,1,5,8
"Volvo 142E",21.4,4,121,109,4.11,2.78,18.6,1,1,4,2

由于我没有完全了解您的数据库结构,我假设您有 3 个表CustomersPurchasesCars

您可以使用相关子查询在聚合函数上使用CASE

SELECT CustomerID, 
       CASE WHEN t1.TotalPurchase = 1 THEN 'one-time-buyer'
       CASE WHEN t1.TotalPurchase = 2 THEN 'two-times-buyer'
       CASE WHEN t1.TotalPurchase > 2 THEN 'frequent-buyer' AS 'PurchaserType'
FROM
   (SELECT CustomerID, COUNT(*) as TotalPurchases FROM Purchases
    GROUP BY CustomerID ) AS t1

您可以根据获取其他所需的列添加您的joins的 rest。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM