簡體   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