2015-06-09 169 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條款標準,你想拉的一年。請注意,這是所有猜測,因爲您的原始問題不包括表格定義或示例數據。如果這沒有給你你想要的輸出,請編輯你的原始問題。