我有一张桌子,它必须像年度歌曲图表一样。它包含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< - 这三个表中的一些示例数据
输出示例将在评论中
请注意,只能输出按等级攀升的歌曲
答案 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年,因此显示在结果
答案 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"/>
子句条件设置为您要提取的年份。请注意,这是所有推测,因为您的原始问题不包括表定义或示例数据。如果这不能为您提供所需的输出,请编辑原始问题。