我正在使用基本的 chinook 資料庫,我正在嘗試獲取一個顯示最暢銷型別的查詢。我基本上得到了答案,但是有一種流派“歌劇”的銷售額為 0,但查詢結果忽略了這一點,并轉到下一個最低的非零值。
我嘗試使用左連接而不是內連接,但這會回傳不同的值。
這是我目前的查詢:
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 銷售額的歌劇值。我怎么能包括那個?我嘗試使用左連接,但會產生不同的結果。
任何幫助表示贊賞。
uj5u.com熱心網友回復:
如果您想包含沒有銷售的型別,那么您應該從開始連接genres,然后LEFT連接到其他表。
此外,您不應使用count(*)which 計算結果集中的任何行。
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 行。
uj5u.com熱心網友回復:
在詢問前 n 名時,必須始終說明如何處理領帶。如果我要查找前 1 行,但表中有 3 行,都具有相同的值,我應該選擇 3 行嗎?零行?任意選擇一排?大多數情況下,我們不想要任意結果,這會排除最后一個選項。這也排除LIMIT了 ,因為LIMITSQLite 中沒有關系的子句。
這是一個示例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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434078.html
上一篇:過濾不同的計數
