簡體   English   中英

內部連接在 SQL 計數聚合中未獲得 0 值

[英]Not getting 0 value in SQL count aggregate by inner join

我正在使用基本的 chinook 數據庫,我正在嘗試獲取一個將顯示最暢銷類型的查詢。 我基本上得到了答案,但是有一種流派“Opera”的銷售額為 0,但查詢結果忽略了它並轉到下一個最低的非零值。

我嘗試使用 left join 而不是 inner join,但它返回不同的值。

這是我目前的查詢:

create view max 
as 
    select distinct 
        t1.name as genre,
        count(*) as Sales 
    from 
        tracks t2 
    inner join 
        invoice_items t3 on t2.trackid == t3.trackid 
    left join 
        genres as t1 on t1.genreid == t2.genreid 
    group by 
        t1.genreid 
    order by 
        2 
    limit 10;

然而,結果跳過了 0 銷售額的歌劇值。 我怎樣才能包括它? 我嘗試使用 left join 但它產生不同的結果。

任何幫助表示贊賞。

如果您想包括沒有銷售的流派,那么您應該從genres開始連接,然后對其他表進行LEFT連接。
此外,您不應使用count(*)來計算結果集中的任何行。

SELECT g.name Genre, 
       COUNT(i.trackid) Sales 
FROM genres g 
LEFT JOIN tracks t ON t.genreid = g.genreid 
LEFT JOIN invoice_items i ON i.trackid = t.trackid 
GROUP BY g.genreid
ORDER BY Sales LIMIT 10; 

不需要關鍵字DISTINCT ,因為查詢為每種流派返回 1 行。

當要求前 n 一個必須總是 state 如何處理關系。 如果我正在尋找前 1,但表中有三行,都具有相同的值,我應該 select 3 行嗎? 零行? 任意選擇一排? 大多數情況下,我們不想要任意結果,這排除了最后一個選項。 這也不包括LIMIT ,因為LIMIT在 SQLite 中沒有關系子句。

這是一個使用DENSE_RANK的示例。 您正在尋找最暢銷的類型,因此我們可能必須查看每種類型的收入,即價格 x 銷量之和。 為了包括沒有發票的流派(甚至可能沒有曲目?),我們將這些數據外部連接到流派表。

select total, genre_name
from
(
  select
    g.name as genre_name,
    coalesce(sum(ii.unit_price * ii.quantity), 0) as total
    dense_rank() over (order by coalesce(sum(ii.unit_price * ii.quantity), 0)) as rnk
  from genres g
  left join tracks t on t.genreid = g.genreid
  left join invoice_items ii on ii.trackid = t.trackid
  group by g.name
) aggregated
where rnk <= 10
order by total, genre_name;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM