SQL Server Pivot与左侧数据中的行和列排序问题的总计
使用下面的查询获取SQL server pivot中按预期工作的行和列的总计 但问题是,问题不在asc-to-desc或desc-to-asc顺序中排序 改变这个 由sQtnNo asc订购 升序/降序没有任何效果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 + ']', '['
/* 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。