[英]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.