繁体   English   中英

左侧数据中行和列排序问题总计的 SQL Server Pivot

[英]SQL Server Pivot With Grand Total For Row And Column Sorting Issue In Left Side Data

使用以下查询获取 SQL Server 数据透视表中行和列的总计,按预期工作。

但问题是问题号不是按升序到降序或降序到升序排序。

改变这个

ORDER BY sQtnNo asc

上升/下降没有任何影响。

/* COLUMNS HEADERS */
DECLARE @columnHeaders NVARCHAR (MAX)
SELECT @columnHeaders  = COALESCE (@columnHeaders   
+ ',[' + sAnsText + ']', '[' + sAnsText + ']')


FROM   tblEntries  
GROUP BY sAnsText
ORDER BY sAnsText

/* GRAND TOTAL COLUMN */
DECLARE @GrandTotalCol  NVARCHAR (MAX)
SELECT @GrandTotalCol = COALESCE (@GrandTotalCol + 'ISNULL ([' + 
CAST (sAnsText AS VARCHAR) +'],0) + ', 'ISNULL([' + CAST(sAnsText AS VARCHAR)+ '],0) + ')
FROM     tblEntries 
  GROUP BY sAnsText
  ORDER BY sAnsText
  SET @GrandTotalCol = LEFT (@GrandTotalCol, LEN (@GrandTotalCol)-1)

/* GRAND TOTAL ROW */
DECLARE @GrandTotalRow  NVARCHAR(MAX)
SELECT @GrandTotalRow = COALESCE(@GrandTotalRow + ',ISNULL(SUM([' + 
CAST(sAnsText AS VARCHAR)+']),0)', 'ISNULL(SUM([' + CAST(sAnsText AS VARCHAR)+']),0)')
FROM     tblEntries  
  GROUP BY sAnsText
  ORDER BY  sAnsText
----------------------------------------------

  -- DROP TABLE  temp_MatchesTotal

/* MAIN QUERY */
DECLARE @FinalQuery NVARCHAR (MAX)
SET @FinalQuery =   'SELECT *, (' + @GrandTotalCol + ') 
AS [Grand Total] INTO  #temp_MatchesTotal
       FROM
          (SELECT  sQtnNo as ''Sort'',sQtnNo ,sAnsText,1 as ''Qty''
             FROM  tblEntries 
          ) A
       PIVOT
          (
              sum (Qty)
              FOR sAnsText
              IN ('  +@columnHeaders +  ') 
          ) B 
          
ORDER BY sQtnNo asc

SELECT * FROM  #temp_MatchesTotal 


UNION ALL

SELECT ''Grand Total'','''','+@GrandTotalRow +',  
ISNULL (SUM([Grand Total]),0) FROM  #temp_MatchesTotal
  DROP TABLE  #temp_MatchesTotal'
  -- PRINT 'Pivot Query '+@FinalQuery
  -- SELECT @FinalQuery
  EXECUTE(@FinalQuery)

结果如下

在此处输入图片说明

任何建议都会非常有帮助。

提前致谢。

使用 Try_Convert() 时出现以下错误

在此处输入图片说明

就像注释中的帮助一样,您的列是varchar ,并且字符串的顺序与数值的顺序不同。 '14'具有比更低的'2''99'具有比大的'843657365476547362'

如果您希望您的列像数值一样排序,则需要将它们视为数值:

ORDER BY CASE Sort WHEN 'Grand Total' THEN 1 ELSE 0 END ASC, --Put Grand Total at the bottom
         TRY_CONVERT(int,Sort) ASC;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM