Sqlite

每對商品的退貨百分比

  • August 7, 2021

我正在使用 SQLite,我有下表: 在此處輸入圖像描述

我有兩個目標:第一個是返回頭等艙預訂量最多的航空公司的 IATA 程式碼。我想到了這一點,但它並不完全奏效,它只是以沒有特定順序的方式返回所有航空公司:

select iata_code_airline
from booked_class_airline
group by class
having MAX(airline_class_count) 

第二個目標是提供一個列,顯示每個艙位中旅行的乘客總數的百分比。我試過:

SELECT class, 
      count(class) as class_count,
      count(class) * 100.0 / (select count(*) from booked_class_airline) as class_percent
FROM booked_class_airline
group by class

但這只是計算類,而不是類的數量。我可以使用 airport_class 計數列,但是我不知道如何劃分每個班級。有什麼建議嗎?

為了解決您的問題,我執行了以下操作(下面的所有程式碼都可以在此處的小提琴中找到):

(說到小提琴,如果您向我們提供一個(DDL 和 DML)以及您的問題會更好 - 它消除了重複工作並提供了**-**single source of truth幫助我們幫助您!另外,請避免使用圖像的原因此連結中概述)。

  • Q1。首先是返回頭等艙預訂量最多的航空公司的 IATA 程式碼。

這比乍一看要復雜。一種天真的方法是執行以下操作:

SELECT
 class, iata, MAX(cnt)
FROM flight
WHERE class = 'First'
GROUP BY class, iata
LIMIT 1;

結果:

class   iata    MAX(cnt)
First     BA           2

但是,當我們執行以下操作時會發生什麼

INSERT INTO flight VALUES
('First', 'EI', 2);

並重新執行我們的查詢?

結果一樣!!!但這是錯誤的!或者至少具有誤導性,因為我們現在有兩家航空公司(BA EI),有兩次預訂頭等艙!這證明了使用少量(或在本例中為最少)數據進行測試的危險!

在這裡,我們應該做的是:

SELECT
 class, iata, MAX(cnt) AS c
FROM flight
WHERE class = 'First'
GROUP BY class, iata
HAVING MAX(cnt) = (
            SELECT 
              MAX(cnt) 
            FROM flight 
            WHERE class = 'First' 
          );

結果:

class   iata    c
First     BA    2
First     EI    2

根據您的要求,這可能(恕我直言,可能)更好。

最後,您可能要考慮的第三種方法是使用視窗函式(v.技術連結 -這個介紹非常好) - 這裡可能有點矯枉過正,但視窗函式對於更複雜的查詢非常強大,並且會回報所花費的任何努力學習它們10次!我在這種情況下使用的是DENSE_RANK()(來自介紹連結)。

SELECT 
 *,
 DENSE_RANK() OVER (PARTITION BY class ORDER BY cnt DESC) AS dr
FROM flight
WHERE class = 'First'
ORDER BY dr ASC;

結果:

class   iata    cnt     dr
First     BA      2     1
First     EI      2     1
First     SN      1     2

然後,您可以包裝這是一個子查詢(參見小提琴)以提取出排名第一的航空公司。你可能會問自己為什麼要使用它?假設您的經理來找您並說,我需要預訂頭等艙航班的排名第三的航空公司 - 與“傳統” SQL 相比很棘手 - 這讓事情變得輕而易舉!

  • Q.2 第二個目標是提供一個列,顯示每個艙位中旅行的乘客總數的百分比。

我已經留下了一些較早的步驟來到達這裡 - 執行這個:

SELECT
class    AS "Class",
SUM(cnt) AS "Total",
ROUND(SUM(cnt) * 1.0/(SELECT SUM(cnt) FROM flight) * 100) AS "Percentage"
FROM flight
GROUP BY class;

結果:

Class   Total   Percentage
Business    4           31
Economy     4           31
First       5           38

您可能想知道為什麼在百分比計算中有一個無用的乘以 1?這是為了避免整數除法的問題 - 嘗試將其取出 - 所有百分比都降至 0!我在這裡找到了這個片段——它更優雅——儘管可能比明確的CAST——YMMV 更令人費解。+1 為我提供了學習經驗的問題!

引用自:https://dba.stackexchange.com/questions/297719