比较两个sql输出

时间:2015-06-09 12:55:36

标签: sql sql-server stored-procedures

我有一张桌子,它必须像年度歌曲图表一样。它包含2000首歌曲及其每年的位置,范围从1999年到2014年。

我必须展示明年在图表中上升的所有歌曲

该表包含SONGID(PK,FK,int,not null)LISTYEAR(PK,int,not null)和POSITION(int,not null)

目标是编写一个带有1个给定参数的存储过程,一年与明年(自己生成的)进行比较,并显示图表中已经上升的歌曲。

例如:

用户将变量@firstyear的值'2012'传递给存储过程。

然后服务器获取变量并添加一个变量以将其放入下一个变量@secondyear中,然后当然应该是2013.

应该有一个只有一个表的输出,它应该在@firstyear中有'Songname''Position'和'在@secondyear'中的位置作为标题。

@secondyear中的'位置'应始终高于'@firstyear'中的位置,因为它只需显示上升的歌曲。

我怎样才能做到这一点? mssql中有一个方法来比较1表中的值吗?

编辑:

我没有向你提供示例数据:

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

http://puu.sh/iii2r/a04d639f2c.png< - 这三个表中的一些示例数据

输出示例将在评论中

请注意,只能输出按等级攀升的歌曲

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

如果您只想获取特定年份的数据,请将 <asp:BoundField DataField="PASS" HeaderText="PASS" SortExpression="PASS" /> <asp:BoundField DataField="FAIL" HeaderText="FAIL" ReadOnly="True" SortExpression="FAIL" /> <asp:BoundField DataField="yettoexecute" HeaderText="yettoexecute" ReadOnly="True" SortExpression="yettoexecute" /> <asp:HyperLinkField DataNavigateUrlFields="Executionid,pass" DataNavigateUrlFormatString="TestResultSummary.aspx?Executionid={0}&pass={1}" HeaderText="Executionid" DataTextField="Executionid"/> 子句条件设置为您要提取的年份。请注意,这是所有推测,因为您的原始问题不包括表定义或示例数据。如果这不能为您提供所需的输出,请编辑原始问题。