我正在做一个SQL问题,我需要找出多少个单位' 2008年,一些音乐商店出售了最畅销的音乐类型。有很多表,但到目前为止,我能够将我需要的大部分信息串在一起。
select
music_store.invoice_lines.invoice_id,
music_store.invoice_lines.track_id,
music_store.invoice_lines.quantity,
music_store.invoices.invoice_date,
music_store.invoices.id,
music_store.tracks.genre_id
from
music_store.invoice_lines
inner join
music_store.invoices on music_store.invoice_lines.invoice_id = music_store.invoices.id
inner join
music_store.tracks on music_store.tracks.id = music_store.invoice_lines.track_id;
从这里开始,我需要过滤掉2008年未结束的所有发票日期,然后找到music_store.tracks.genre_id的模式,找到相应的类型(这是另一个表),然后汇总所有"数量"值。
我该怎么做?我很迷失,也是SQL的绝对初学者,或者或多或少是初学者。
编辑:我不知道我使用的是什么DBMS,可能是最标准的SQL版本?我在Wagon fwiw上运行SQL答案 0 :(得分:1)
在不知道您正在使用的特定RDBMS的情况下,SQL代码看起来像这样,以获得genre_id
的模式。然后,您可以加入流派表格以获取流派名称。希望这会有所帮助。
select music_store.tracks.genre_id, COUNT(1) genre_count
from music_store.invoice_lines
INNER JOIN music_store.invoices
on music_store.invoice_lines.invoice_id = music_store.invoices.id
INNER JOIN music_store.tracks
on music_store.tracks.id = music_store.invoice_lines.track_id
WHERE YEAR(music_store.invoices.invoice_date) = 2008
GROUP BY music_store.tracks.genre_id
ORDER BY genre_count DESC
LIMIT 1;
答案 1 :(得分:1)
最通用的,可能性能最好的(“sargable”)方法是简单地指定2个日期,然后在这些日期设置的边界内选择记录。
WHERE invoices.invoice_date >= '2008-01-01'
AND invoices.invoice_date < '2009-01-01'
使用&gt; = with&lt;是故意的,它允许被评估的列具有任何时间单位精度。另外,通过避免数据上的函数,dbms可以使用日期列上的索引,同时避免计算每个函数。
由于您没有指定使用哪个dbms,因此我无法预测您需要如何指定这些日期文字。你可以使用to_date()或str_to_date()作为例子
的MySQL
WHERE invoices.invoice_date >= str_to_date('2008-01-01','%Y-%m-%d')
AND invoices.invoice_date < str_to_date('2009-01-01','%Y-%m-%d')
的Oracle
WHERE invoices.invoice_date >= to_date('2008-01-01','yyyy-mm-dd')
AND invoices.invoice_date < to_date('2009-01-01','yyyy-mm-dd')
T-SQL
WHERE invoices.invoice_date >= '20080101'
AND invoices.invoice_date < '20090101'
请注意,列invoices.invoice_date的实际数据类型将影响适用的函数,并且我假设此列不是看起来像日期/时间值的字符串。