Sql 需要行号为()的动态轴
我正在使用MicrosoftSQLServerManagementStudio 2008 我有如下数据:Sql 需要行号为()的动态轴,sql,sql-server,pivot,row-number,dynamic-columns,Sql,Sql Server,Pivot,Row Number,Dynamic Columns,我正在使用MicrosoftSQLServerManagementStudio 2008 我有如下数据: Client ID Value ------------------------------- 12345 Did Not Meet 12345 Did Not Meet 12345 Partially Met 12346 Partially Met 12346 Par
Client ID Value
-------------------------------
12345 Did Not Meet
12345 Did Not Meet
12345 Partially Met
12346 Partially Met
12346 Partially Met
12346 Partially Met
12347 Partially Met
12347 Partially Met
12347 Did Not Meet
12347 Met
Client ID Value1 Value2 Value3 Value4
12345 Did Not Meet Did Not Meet Partially Met NULL
12346 Partially Met Partially Met Partially Met NULL
12347 Partially Met Partially Met Did Not Meet Met
我希望结果如下所示:
Client ID Value
-------------------------------
12345 Did Not Meet
12345 Did Not Meet
12345 Partially Met
12346 Partially Met
12346 Partially Met
12346 Partially Met
12347 Partially Met
12347 Partially Met
12347 Did Not Meet
12347 Met
Client ID Value1 Value2 Value3 Value4
12345 Did Not Meet Did Not Meet Partially Met NULL
12346 Partially Met Partially Met Partially Met NULL
12347 Partially Met Partially Met Did Not Meet Met
这些列是未知的,所以我知道我需要一个动态查询。我尝试了一个带有pivot函数的动态查询,但只得到了同一类型值下的分组。所以聚合函数对我不利
这就是我尝试的问题:
Declare @Columns nvarchar(max);
Declare @DynamicPivotQuery nvarchar(max);
Select @Columns=
COALESCE(@Columns+',','')+QUOTENAME(Value)
from (select distinct Document.Value
from Document d
join Client c on d.clientid=c.id
)
as t1
Set @DynamicPivotQuery=
N'Select ClientID, ' + @Columns + '
from
(select Document.ClientID,
DocumentFact.Value,
from Document d
join Client c on d.clientid=c.id
) p
Pivot (max(Value) for Value in ('+@Columns+'))
as pivottable
order by ClientID;'
执行官(@DynamicPivotQuery)
接下来,我添加了行数和分区函数,但似乎无法调试它。我得到的错误是:
味精102,第15级,状态1,第29行“')附近的语法不正确 它靠近XML路径函数 在此方面的任何帮助都将不胜感激。谢谢
select @Columns=
COALESCE(@Columns+',','')+QUOTENAME(Value)
from (select distinct Document.Value
, 'name'+ CAST (row_number() over
(Partition BY clientid order by clientid) as NVARCHAR (10)) as Cols
from document d
join Clients c on d.clientid=c.id
t1
--FOR XML PATH('')), 1, 1, N'');
FOR XML PATH('')), TYPE).value('.','NVARCHAR(MAX)'),1,2,'')
order by ClientID
使用
cte
,使用行号
可以获得以下结果:
您的模式:
查询:
结果是:
你不能用php、python、javascript这样的脚本来完成吗?@WixLove请随时提供反馈,抱歉——我正在重写我的评论,因为第一次不清楚。谢谢你的回复。我尝试在SQL上运行您的示例,但Fiddle根本无法运行您的查询。上面的帖子是我问题的简化版。我自定义了更复杂的查询,没有收到错误消息,但查询运行了15分钟。我不知道为什么我不能让您的查询在SQL FIDLE中运行。通过添加一些过滤器,我终于能够使您建议的查询正常运行,从而使运行时间大大加快,从而可以看到结果。这正是我想要的,我非常感谢你!欢迎您,兄弟,只需在
选择cte
后的部分,您还可以使用4个自连接
而不是子查询。
Client ID value1 value2 value3 value4
12345 Did Not Meet Did Not Meet Partially Met (null)
12346 Partially Met Partially Met Partially Met (null)
12347 Did Not Meet Met Partially Met Partially Met