簡體   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