2015-06-09 124 views
0

我有一个表,其中有类似于年度歌曲排行榜。它包含了2000首歌曲和它们每年地位,从1999年到2014年比较两个SQL输出

我必须证明已在图表明年

表包含SONGID(PK,FK水涨船高所有歌曲,int,not null)LISTYEAR(PK,int,not null)和POSITION(int,not null)

目标是编写一个给定参数的存储过程,一年与(自生成的)明年将显示已经上涨的歌曲。

例如:

的用户通过对可变@firstyear到存储过程的值“2012”。

随后服务器采取的变量,并增加了一个把它放在下一个变量@secondyear,然后应该是当然的2013。

应该有只有一个表的输出,它应该有@firstyear“SONGNAME“位置”和“在@secondyear位置”作为标题。

值“在@secondyear位置”应该总是比“在@firstyear位置”更高,因为它只有表明上升的歌曲。

我该如何做到这一点?在mssql中是否有方法来比较1个表中的值?

编辑:

愚蠢的我不要你提供示例数据:

http://puu.sh/iihTc/4518dbcea9.png < - 数据库图表

http://puu.sh/iii2r/a04d639f2c.png < - 这三个表

输出在一些示例数据例如将在评论

注ŧ帽子只有歌曲可以输出其在排名

+2

不完全清楚,显示一些示例数据和预期输出 –

+1

提供示例数据和预期输出。 –

+0

我不认为你需要SecondYear参数。从我所能理解的问题中你将不得不为你的@firstyear参数创建一个临时表,然后你将Atfirstyear设置为你感兴趣的年份。加入主要查询的临时数据,然后这些年份将循环执行它们的设置。我可以发布一个示例答案,我没有,因为我不熟悉mssql。 – SQLUser44

回答

1

爬上我想你想这

declare @year as int = 2011 
select a.songid, a.position, b.position from YourTable a 
inner join YourTable b on a.songid = b.songid 
where a.YEAR = @year and b.year = @year + 1 and a.position > b.position 

见下文,唯歌2已经从2011年提前到2012年,结果这样显示

enter image description here

+0

在OP中增加了示例数据和输出,谢谢! – Maarten

+0

你的答案看起来很有希望。今天晚上去试试这个吧 – Maarten

+0

太好了,试试让我知道结果。 –

0

就个人而言,我不会用变量此。我会把桌子重新放回去。如果你正在处理非常大的数据集(数以亿计的行),你可能需要对性能进行双向测试以确保性能,但将表重新映射到自身对我来说更有意义。

CREATE TABLE dbo.AnnualSongChart 
(
    SongID INT NOT NULL 
    , ListYear INT NOT NULL 
    , Position INT NOT NULL 
    , SongName VARCHAR(50) 
) 

INSERT INTO dbo.AnnualSongChart(SongID, ListYear, Position, SongName) 
SELECT 1, 2012, 14, 'Grieg: Peer Gynt: In The Hall of the Mountain King' 
UNION ALL 
SELECT 1, 2013, 15, 'Grieg: Peer Gynt: In The Hall of the Mountain King' 
UNION ALL 
SELECT 2, 2012, 12, 'Wagner: Die Walkure' 
UNION ALL 
SELECT 2, 2013, 11, 'Wagner: Die Walkure' 

--Code to pull your report 
SELECT DISTINCT 
    CurrentYear.ListYear 
    , CurrentYear.SongName 
    , CurrentYear.Position 
FROM dbo.AnnualSongChart CurrentYear 
JOIN dbo.AnnualSongChart LastYear 
ON 
    CurrentYear.ListYear = LastYear.ListYear + 1 
    AND CurrentYear.SongID = LastYear.SongID 
WHERE 
    CurrentYear.Position < LastYear.Position 
    -- AND CurrentYear.ListYear = 2013 

如果你只希望得到的数据有一定的一年,使WHERE条款标准,你想拉的一年。请注意,这是所有猜测,因为您的原始问题不包括表格定义或示例数据。如果这没有给你你想要的输出,请编辑你的原始问题。