在SQL中对数据透视表排序
我有一个从数据透视表返回数据的过程。我只需要对这些数据进行排序,以便PIVOT按特定顺序显示列。我需要按区域表中的SortOrder字段对它们进行排序。这是我的剧本。我实际上不需要返回sortorder字段,我只需要按sortorder排序的列。谢谢你的帮助在SQL中对数据透视表排序,sql,sql-server,pivot,Sql,Sql Server,Pivot,我有一个从数据透视表返回数据的过程。我只需要对这些数据进行排序,以便PIVOT按特定顺序显示列。我需要按区域表中的SortOrder字段对它们进行排序。这是我的剧本。我实际上不需要返回sortorder字段,我只需要按sortorder排序的列。谢谢你的帮助 CREATE TABLE #Temp ( Region VARCHAR(255), SortOrder INT, Visible BIT ) INSERT INTO #Temp SELECT R.Regio
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);
在最初的select before 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
我正在尝试按照pivot London和Middlesex first、Oxford和Norfolk first等之前表中所示的顺序对列进行排序。如果您希望对最后的列进行排序,那么您应该能够在获得@regionList的查询中添加order BY SortOrder,以便将代码更改为以下内容:
DECLARE @RegionList varchar(2000),@SQL varchar(max)
SELECT @RegionList = STUFF((SELECT ',' + QuoteName(Region)
FROM #Temp
GROUP BY Region, SortOrder
ORDER BY SortOrder --- add the SortOrder here
FOR XML PATH('')),1,1,'')
您当前的代码按区域对数据进行排序,因此它是按字母顺序排列的。您需要实现此列表中的排序器 如果希望对最后的列进行排序,那么您应该能够在查询中添加ORDER BY SortOrder,以获取@regionList,从而将代码更改为以下内容:
DECLARE @RegionList varchar(2000),@SQL varchar(max)
SELECT @RegionList = STUFF((SELECT ',' + QuoteName(Region)
FROM #Temp
GROUP BY Region, SortOrder
ORDER BY SortOrder --- add the SortOrder here
FOR XML PATH('')),1,1,'')
您当前的代码按区域对数据进行排序,因此它是按字母顺序排列的。您需要实现此列表中的排序器 如果在select from temp中包含SortOrder列,是否会出现错误?结果显示了什么?如果我将SortOrder添加到临时表中,它会弄乱数据透视,而不是返回1行,而是为每个SortOrder值返回多行1。您可以发布create table语句、每个表的一些示例数据以及所需的结果吗?或使用现有结构/数据创建?如果在select from temp中包含SortOrder列,是否会出现错误?结果显示了什么?如果我将SortOrder添加到临时表中,它会弄乱数据透视,而不是返回1行,而是为每个SortOrder值返回多行1。您可以发布create table语句、每个表的一些示例数据以及所需的结果吗?或者用你现有的结构/数据创建一个应用程序?谢谢,这非常好!我试图对那个部分进行分类,但我做得不对。感谢againGlad,它正在工作,一旦你发布了数据,就更容易看到如何修复它。谢谢,工作得很好!我试图对那个部分进行分类,但我做得不对。感谢againGlad,它正在工作,一旦你发布了数据,就更容易看到如何修复它。