未通过内部联接在 SQL 计数聚合中获得 0 值

Not getting 0 value in SQL count aggregate by inner join

我正在使用基本的 chinook 数据库,我正在尝试获取一个将显示最畅销类型的查询。我基本上得到了答案,但是有一种类型 'Opera' 的销售额为 0,但查询结果忽略了它并继续移动到下一个最低的非零值。

我尝试使用左连接而不是内部连接,但是 returns 不同的值。

这是我目前的查询:

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 销量的歌剧值。我怎样才能包括它?我尝试使用左连接,但它产生了不同的结果。

感谢任何帮助。

如果您想包括没有销量的流派,那么您应该从 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,因为查询 returns 每个流派 1 行。

当询问前 n 名时,必须始终说明如何处理平局。如果我要查找前 1 行,但 table 中有三行,它们的值都相同,我应该 select 3 行吗?零行?任意选择一排?大多数情况下,我们不想要任意结果,这排除了最后一个选项。这也排除了 LIMIT,因为 LIMIT 在 SQLite 中没有关系子句。

这里是 DENSE_RANK 的示例。您正在寻找最畅销的类型,因此我们可能必须查看每种类型的收入,即价格 x 销量之和。为了包括没有发票的流派(甚至可能没有曲目?)我们将此数据外部连接到流派 table。

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;