3

私はC#で1つのWindowsアプリケーションに取り組んでいます.その中で、テーブルレイアウトパネルにカテゴリごとの本の画像を表示したいフォームが1つあります.そして、カテゴリごとに5つの本の画像を表示したい.

カテゴリごとの本を取得するために使用するクエリは

WITH CategoryCTE AS (
    SELECT 
        BookName,
        ROW_NUMBER() OVER (
            PARTITION BY CategoryName
            ORDER BY CategoryName DESC
        ) AS CTE_Order
    FROM BookMaster
)
SELECT bm.BookName,bm.BookImage, cm.CategoryName, scm.SubCategoryName
FROM 
    CategoryCTE 
    INNER JOIN BookMaster bm ON CategoryCTE.BookName = bm.BookName
    INNER JOIN CategoryMaster cm ON bm.CategoryName = cm.Oid
    INNER JOIN SubCategoryMaster scm ON bm.SubCategoryName = scm.Oid
WHERE CategoryCTE.CTE_Order < 6
GROUP BY cm.CategoryName, scm.SubCategoryName, bm.BookName,bm.BookImage

このクエリでは、適切な出力が得られます。つまり、各カテゴリから 5 冊の本が得られます。しかし、問題は、テーブル パネルに本の画像を表示したいということです。行 1 にはカテゴリ 1 の 5 つの書籍の画像があり、行 2 にはカテゴリ 2 の書籍の画像があります。今、データベースには 4 つの書籍のカテゴリがあります。つまり、テーブル レイアウト パネルの行はデータベースのカテゴリ テーブルに依存し、テーブルの列は固定されています。つまり、最初の列はカテゴリ名で、他の 5 列は書籍の画像です。

質問を適切に説明できたことを願っています。これに対する解決策を提案してください。前もって感謝します。

4

1 に答える 1

1

結果を次のようにしたい場合:

CategoryName   Book1         Book2             Book3           Book4          Book5
------------   -----------   ---------------   --------------  -------------  ------------
Cat1           Image#6.jpg   Image#61.jpg      Image#62.jpg    Image#63.jpg   Image#64.jpg
Cat2           Image#5.jpg   Image#51316.jpg   Image#5136.jpg  Image#516.jpg  Image#56.jpg

次のクエリでそれを行う必要があります。

WITH CategoryCTE AS (
    SELECT 
        BookName,
        ROW_NUMBER() OVER (
            PARTITION BY CategoryName
            ORDER BY CategoryName DESC, BookName
        ) AS CTE_Order
    FROM BookMaster    
)

SELECT CategoryName, [1] AS Book1, [2] AS Book2, [3] AS Book3, [4] AS Book4, [5] AS Book5
FROM 
(SELECT bm.BookImage, cm.CategoryName, c.CTE_Order FROM 
    CategoryCTE c
    INNER JOIN BookMaster bm ON c.BookName = bm.BookName
    INNER JOIN CategoryMaster cm ON bm.CategoryName = cm.Oid
    INNER JOIN SubCategoryMaster scm ON bm.SubCategoryName = scm.Oid
WHERE c.CTE_Order < 6
GROUP BY cm.CategoryName, bm.BookImage, c.CTE_Order
) Sub
PIVOT (MAX(BookImage) FOR CTE_Order IN ([1],[2],[3], [4],[5])) AS PivotTable
于 2013-07-21T12:39:06.213 に答える