简体   繁体   English

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

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

I need some help with an SQL exercise that has me completely stumped.我需要一些 SQL 练习的帮助,这让我完全被难住了。 For an assignment, I have a question asking me to print a list of names with different descriptions attached depending on how many times they appear in a pre-existing list.对于一项作业,我有一个问题要求我打印一份名称列表,其中附有不同的描述,具体取决于它们在预先存在的列表中出现的次数。 The question verbatim is posted below for reference:问题逐字发布在下面以供参考:

SI schema contains customers that have bought one or more vehicles. SI 模式包含购买了一辆或多辆汽车的客户。 They can be classified using the following criteria:它们可以使用以下标准进行分类:

  • Customers that have bought only one car (one-time buyer)仅购买一辆车的客户(一次性购买者)
  • Customer that have bought two cars (two-time buyer)已购买两辆车的客户(两次购买者)
  • Customers that have bought more than two cars (frequent buyer)购买两辆车以上的客户(常客)

Using a SINGLE SELECT statement, display a list of customers with their names and what type of buyer they are for all those customers that have bought Jaguar car makes.使用 SINGLE SELECT 声明,显示客户列表及其姓名以及购买 Jaguar 汽车的所有客户的买家类型。

The code I have written is posted here:我写的代码贴在这里:

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');

That is just what I have currently -- I am constantly taking things out and adding things and rearranging things -- nothing seems to work.这正是我目前所拥有的——我不断地取出东西、添加东西和重新排列东西——似乎没有任何效果。 I am being met with error after error.我遇到一个又一个错误。 I have been trying to follow along with any CASE statement resources I can find including the ones provided to me by my instructor, but nothing seems to be helping me.我一直在尝试遵循我能找到的任何 CASE 声明资源,包括我的导师提供给我的资源,但似乎没有任何帮助。 There are plenty of resources detailing what to do in regards to working with directly assigned values, but never anything related to I'm supposed to use this to find the amount of items that appear in a list.有很多资源详细说明了如何处理直接分配的值,但从来没有任何与我应该使用它来查找列表中出现的项目数量相关的内容。 It doesn't matter how well I follow along with example code, my IDE just isn't liking what I am putting in.不管我如何遵循示例代码,我的 IDE 只是不喜欢我输入的内容。

I don't want any outright changes to my code, I just want somebody to point out what I'm doing wrong because at the moment, I have no clue whatsoever.我不希望对我的代码进行任何彻底的更改,我只是希望有人指出我做错了什么,因为目前我一无所知。

I am brand new to StackOverflow (in terms of actually posting content on the site), so I may not know how to navigate replies and posts and such, but I'll do my best.我是 StackOverflow 的新手(就在网站上实际发布内容而言),所以我可能不知道如何浏览回复和帖子等,但我会尽力而为。

Thank you all.谢谢你们。

I'll demonstrate with R's mtcars dataset.我将使用 R 的mtcars数据集进行演示。 cyl is a reasonable field to test on, so I'll project that as your "Customer name". cyl是一个合理的测试字段,因此我将其投影为您的“客户名称”。 A change for this example: I'll use ranges of values instead of simple equality.示例的更改:我将使用值范围而不是简单的相等。

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

I think you intend to join it back on some data, likely from another table.我认为您打算将它重新加入一些数据,可能来自另一个表。 I'll just join it back on itself (odd perhaps), effectively the same method.我只是将它自己重新加入(也许很奇怪),实际上是相同的方法。

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

(This was done in SQLite, though it should perform the same in other DBMSs.) (这是在 SQLite 中完成的,尽管它应该在其他 DBMS 中执行相同的操作。)


Data数据

"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

As I didn't get complete idea of your database structure, I am assuming you have 3 tables Customers , Purchases and Cars .由于我没有完全了解您的数据库结构,我假设您有 3 个表CustomersPurchasesCars

You can use corelated subquery to use CASE on aggregate functions.您可以使用相关子查询在聚合函数上使用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

You can add rest of your joins according to get other required columns.您可以根据获取其他所需的列添加您的joins的 rest。

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

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