0

個別の行を表示する必要があります。実際には、日付フィールドに基づいて年ごとに最新の行を 1 つ取得する必要があります。

CTE を使用してこれを解決しようとしましたが、さらにテストすると、ROWNumber に基づいて ROW のみを取得し、フィルターを使用すると目的の結果が得られないため、適切に機能しません。

そこで、テーブルから AlbumID、AlbumName、AlbumDate、および AlbumYear_YYYY を取得してデータセットに渡し、このデータセットに対して LINQ を使用して、年のみの最新アルバムに基づいて一意の行をさらに取得することを考えました

テーブルに次の行があると仮定します

AlbumID、AlbumName、AlbumDate、AlbumIcon

私のMS-SQLクエリ

string sql= "SELECT AlbumID, AlbumName, AlbumIcon, AlbumDate, DATEPART(YYYY, AlbumDate) AS Year FROM PhotoAlbumName "

DataSet ds = DataProvider.Connect_Select(strSql);
DataView dv = ds.Tables[0].DefaultView;

//ここで LINQ を実行し、linq の値を Pager コントロールに渡します

 PagerControl1.BindDataWithPaging(rptAlbumsCategories, dv.Table);

これを行う方法はわかりませんが、それが機能する場合、次のSQLクエリが原因で発生する不要な結果が排除されます.

;WITH DistinctYEAR AS
(
    SELECT AlbumID, AlbumIcon, AlbumDate, AlbumVisible,AlbumName,
        ROW_NUMBER() OVER(PARTITION BY DATEPART(YYYY,AlbumDate) ORDER BY AlbumDate) AS 'RowNum'
    FROM PhotoAlbumName 
)
SELECT * FROM DistinctYEAR WHERE RowNum = 1 AND AlbumVisible = 1 ORDER BY AlbumDate DESC

アップデート:

4

1 に答える 1

1

よくわかりませんが、cteが間違っていると思います。を外側WHERE AlbumVisible = 1 ではなくに適用する必要があります。CTESELECT

;WITH DistinctYEAR AS
(
    SELECT AlbumID, AlbumIcon, AlbumDate, AlbumVisible,AlbumName,
        ROW_NUMBER() OVER(PARTITION BY DATEPART(YYYY,AlbumDate) ORDER BY AlbumDate) AS 'RowNum'
    FROM PhotoAlbumName
    WHERE AlbumVisible = 1  
)
SELECT dy.* 
FROM DistinctYEAR dy 
WHERE RowNum = 1
ORDER BY AlbumDate DESC
于 2013-09-29T11:47:57.990 に答える