具有数字列的SQL Server数据透视表

具有数字列的SQL Server数据透视表,sql,sql-server,pivot-table,Sql,Sql Server,Pivot Table,当我在MS SQL Server Management Studio中运行一个简单查询(其中AskiaID是一个数字字段)时,我得到以下结果:- SELECT TaskResult, [80444], [80421], [80438], [80435], [80046], [80427], [80378], [80442], [80419], [80436], [80379], [80410], [80439], [80437], [80405], [80377], [80383], [8040

当我在MS SQL Server Management Studio中运行一个简单查询(其中AskiaID是一个数字字段)时,我得到以下结果:-

SELECT TaskResult, [80444], [80421], [80438], [80435], [80046], [80427], [80378], [80442], [80419], [80436], [80379], [80410], [80439], [80437], [80405], [80377], [80383], [80406], [80420], [80443] FROM [RSM.Statistics].[dbo].[Statistic_Call] as PivotData
PIVOT
(
   COUNT(TaskResult)
   FOR RTRIM(CAST(AgentID AS CHAR)) IN ([80444], [80421], [80438], [80435], [80046], [80427], [80378], [80442], [80419], [80436], [80379], [80410], [80439], [80437], [80405], [80377], [80383], [80406], [80420], [80443])
) AS PivotResult
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near '('.
如果我将查询更改为其原始形式:-

SELECT TaskResult, [80444], [80421], [80438], [80435], [80046], [80427], [80378], [80442], [80419], [80436], [80379], [80410], [80439], [80437], [80405], [80377], [80383], [80406], [80420], [80443] FROM [RSM.Statistics].[dbo].[Statistic_Call] as PivotData
PIVOT
(
   COUNT(TaskResult)
   FOR AgentID IN (80444, 80421, 80438, 80435, 80046, 80427, 80378, 80442, 80419, 80436, 80379, 80410, 80439, 80437, 80405, 80377, 80383, 80406, 80420, 80443)
) AS PivotResult
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near '80444'.

你知道我做错了什么吗?

你试过使用弦乐而不是铸造吗

declare @Statistic_Call table
(
    AgentId int,
    TaskResult varchar(10)
)
insert into @Statistic_Call(AgentId, TaskResult)
values
(80444, 'Test 1'),
(80444, 'Test 2'),
(80421, 'Test 1'),
(80438, 'Test 2'),
(80435, 'Test 1'),
(80046, 'Test 1'),
(80427, 'Test 3'),
(80378, 'Test 1'),
(80442, 'Test 1'),
(80419, 'Test 4'),
(80436, 'Test 1'),
(80379, 'Test 2'),
(80410, 'Test 1'),
(80439, 'Test 1'),
(80437, 'Test 3'),
(80405, 'Test 1'),
(80377, 'Test 2'),
(80383, 'Test 1'),
(80406, 'Test 1'),
(80420, 'Test 3'),
(80443 ,'Test 1');


SELECT TaskResult, [80444], [80421], [80438], [80435], [80046], [80427], [80378], [80442], [80419], [80436], [80379], [80410], [80439], [80437], [80405], [80377], [80383], [80406], [80420], [80443] 
FROM 
(
select TaskResult, AgentId, 1 as rownum --row_number() over (order by(select null)) as rownum
from @Statistic_Call as PivotData
) as src
PIVOT
(
   count(rownum)
   FOR AgentId IN ([80444], [80421], [80438], [80435], [80046], [80427], [80378], [80442], [80419], [80436], [80379], [80410], [80439], [80437], [80405], [80377], [80383], [80406], [80420], [80443])
) AS PivotResult;
从[RSM.Statistics].[dbo].[Statistic(调用]中选择TaskResult[80444]、[80421]、[80438]、[80438]、[80435]、[80046]、[80427]、[80448]、[80442]、[80419]、[80436]、[8079]、[80410]、[80439]、[80437]、[80405]、[80437]、[8083]、[80406]、[80420]、[80443]作为数据透视数据透视
支点
(
计数(任务结果)
对于AgentID IN([80444]、[80421]、[80438]、[80435]、[80046]、[80427]、[80378]、[80442]、[80419]、[80436]、[80379]、[80437]、[80405]、[80377]、[80833]、[80406]、[80420]、[80443])
)结果

使用子查询修复列。是否要扩展您的想法?Gordon?有一件事您做错了,那就是强制转换为char,但没有指定长度。这是非常有问题的…但在这种情况下,你很幸运。这篇文章讨论了为什么varchar不好,但同样的逻辑也适用于char。当然,由于数据长度不同,您可能仍应该使用varchar。查询将引发错误:
无效的列名“TaskResult”。
因为TaskResult在聚合中。很好!!!实际上不需要派生的rownum列,您可以使用不可为null的列,例如TaskID<代码>'FROM(从[RSM.Statistics].[dbo].[Statistic\u Agent]中选择TaskResult、AgentID和Taskid,其中Taskid=1937)作为数据透视数据透视(计数(Taskid)对于AgentID…是的,您可以避免使用rownum列。例如,我可能会进一步开发此代码,以执行更高级的计算,而不仅仅是计数。例如,成本或小时的总和,因此rownum列很有用。谢谢您的帮助顺便说一句:)