PIVOT テーブルからデータを返すプロシージャがあります。PIVOT が列を特定の順序で表示するように、このデータを並べ替えるだけです。Regions テーブルの「SortOrder」フィールドで並べ替える必要があります。これが私のスクリプトです。実際には、sortorder フィールドが返される必要はありません。sortorder で並べ替えられた列が必要なだけです。どんな助けでも大歓迎です
CREATE TABLE #Temp
(
Region VARCHAR(255),
SortOrder INT,
Visible BIT
)
INSERT INTO #Temp
SELECT R.Region, R.SortOrder, CASE WHEN (ISNULL(R_SR.RegionID,0) = 0 AND ISNULL(R_SR_Serv.RegionID,0) = 0) THEN 0 ELSE 1 END AS Visible
FROM ServiceRecord SR
INNER JOIN Sites S ON SR.SiteID = S.SiteID
INNER JOIN Regions R ON R.SiteID = S.SiteID
LEFT OUTER JOIN lkup_Region_ServiceRecord R_SR ON R_SR.RegionID = R.RegionID AND R_SR.ServiceRecordID = SR.ServiceRecordID
LEFT OUTER JOIN lkup_Region_ServiceRecord_Serv R_SR_Serv ON R_SR_Serv.RegionID = R.RegionID AND R_SR_Serv.ServiceRecordID = SR.ServiceRecordID
WHERE SR.ServiceRecordID = @ServiceRecordID
AND R.RegionID % 100 != 0
AND SR.IsDeleted = 0
AND SR.English = 1
AND SR.PostedMain = 1
ORDER BY SR.ServiceRecordID, R.SortOrder
DECLARE @RegionList varchar(2000),@SQL varchar(max)
SELECT @RegionList = STUFF((SELECT DISTINCT ',' + QuoteName(Region) FROM #Temp ORDER BY ',' + QuoteName(Region) FOR XML PATH('')),1,1,'')
SET @SQL='
SELECT
A.*
FROM
(
SELECT
Region,
CAST(Visible AS INT) AS Visible
FROM #Temp
) B
PIVOT(MAX(Visible) FOR Region IN (' + @RegionList + ')) A
ORDER BY SortOrder;';
EXEC (@SQL);
最初の選択 (PIVOT の前) で、次のテーブルを取得します (これは、ピボットしたい順序です。
London and Middlesex 0
Oxford and Norfolk 1
Elgin 0
Huron and Perth 1
Grey and Bruce 0
ピボット後、これが私の結果です
Elgin Grey and Bruce Huron and Perth London and Middlesex Oxford and Norfolk
0 0 1 0 1
ピボットの前にテーブルが示すのと同じ順序で列を並べ替えようとしています (ロンドンとミドルセックスが最初、オックスフォードとノーフォークが 2 番目など)。