未通过内部联接在 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;
我正在使用基本的 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;