Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server Pivot与左侧数据中的行和列排序问题的总计_Sql_Sql Server_Tsql_Sql Server 2014 - Fatal编程技术网

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

SQL Server Pivot与左侧数据中的行和列排序问题的总计,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,使用下面的查询获取SQL server pivot中按预期工作的行和列的总计 但问题是,问题不在asc-to-desc或desc-to-asc顺序中排序 改变这个 由sQtnNo asc订购 升序/降序没有任何效果 /* COLUMNS HEADERS */ DECLARE @columnHeaders NVARCHAR (MAX) SELECT @columnHeaders = COALESCE (@columnHeaders + ',[' + sAnsText + ']', '['

使用下面的查询获取SQL server pivot中按预期工作的行和列的总计

但问题是,问题不在asc-to-desc或desc-to-asc顺序中排序

改变这个

由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()时,出现以下错误


与注释中的aid类似,您的列是一个
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;

仅供参考,
'['+ObjectName+']'
注射时不安全。使用
QUOTENAME
。您还在此处标记了3个不同版本的SQL Server;无支持,1个生命周期结束。你真正使用的是什么版本?而且,从那张图片上看,它看起来排序正确;显然,
Sort
是一种字符串数据类型(
varchar
?),因此这是完全正确的<代码>'14'的值低于
'2'
。如果您需要数据按数值排序,请使用数字数据类型。使用SQL-Server-2014。目前,问题No被定义为nvarchar(5),但如果我将nvarchar更改为int,那么我在GrandTotal声明中面临另一个问题,这会引发另一种类型的错误。旁注:一些必要的阅读:Hosnestly,添加“totals”行是我个人认为应该在表示层中完成的事情,不是RDBMS。但是,如果您希望列像数字值一样排序,而不是字符串值,那么正如我所说的,您需要使列成为数字数据类型;要么将列设置为数字数据类型,要么使用
(TRY_uu)CONVERT
<代码>14大于
2
;同样的排序顺序不可能正确运行,@sixthense。