简体   繁体   中英

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

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

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.

Thank you all.

I'll demonstrate with R's mtcars dataset. cyl is a reasonable field to test on, so I'll project that as your "Customer name". 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.)


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 .

You can use corelated subquery to use CASE on aggregate functions.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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