Sql server SQL Pivot如何用于矩阵视图和多表
问题:我有两个表,如下所示,我想从中查看矩阵Sql server SQL Pivot如何用于矩阵视图和多表,sql-server,pivot,Sql Server,Pivot,问题:我有两个表,如下所示,我想从中查看矩阵 WorkflowStatus(状态编号可由用户定义) 工作流矩阵 问题:如何在SQL中使用Pivot命令查看结果,如下所示 | Draft | Submitted | Approved | Rejected | Closed ========================================================================= 1 Draft
| Draft | Submitted | Approved | Rejected | Closed
=========================================================================
1 Draft | | true | true | |
2 Submitted | | | true | true |
3 Approved | | | | | true
4 Rejected | | true | | |
5 Closed | | | | |
非常感谢您的帮助。这是一个令人困惑的问题
SELECT id,
NAME,
Max(CASE WHEN nextstatus = 1 THEN 'True' ELSE '' END) [Draft],
Max(CASE WHEN nextstatus = 2 THEN 'True' ELSE '' END) [Submitted],
Max(CASE WHEN nextstatus = 3 THEN 'True' ELSE '' END) [Approved],
Max(CASE WHEN nextstatus = 4 THEN 'True' ELSE '' END) [Rejected],
Max(CASE WHEN nextstatus = 5 THEN 'True' ELSE '' END) [Closed]
FROM WorkflowStatus a
LEFT JOIN WorkflowMatrix b
ON a.id = b.oldstatus
GROUP BY id,
NAME
ORDER BY id
这是一个令人困惑的支点
SELECT id,
NAME,
Max(CASE WHEN nextstatus = 1 THEN 'True' ELSE '' END) [Draft],
Max(CASE WHEN nextstatus = 2 THEN 'True' ELSE '' END) [Submitted],
Max(CASE WHEN nextstatus = 3 THEN 'True' ELSE '' END) [Approved],
Max(CASE WHEN nextstatus = 4 THEN 'True' ELSE '' END) [Rejected],
Max(CASE WHEN nextstatus = 5 THEN 'True' ELSE '' END) [Closed]
FROM WorkflowStatus a
LEFT JOIN WorkflowMatrix b
ON a.id = b.oldstatus
GROUP BY id,
NAME
ORDER BY id
您可以尝试此操作,但在数据透视表上使用GROUP BY时仍然遇到问题
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT ',' + QUOTENAME(id)
from #WorkflowStatus
group by id, Name
order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @query = '
WITH Pivoted
AS
(
SELECT OldStatus, '+ @cols +' FROM
#WorkflowStatus a
LEFT JOIN #WorkflowMatrix b
ON a.id = b.NextStatus
PIVOT
(
COUNT(NextStatus)
for NextStatus in (' + @cols + ')
) p
)
SELECT OldStatus,'+@cols+'
FROM Pivoted a
WHERE OldStatus IS NOT NULL
GROUP BY OldStatus,'+ @cols +'
ORDER BY OldStatus ASC
';
exec sp_executesql @query;
我希望我能帮忙。
以下是您可以尝试此操作,但在数据透视表上使用GROUP BY时,我仍然遇到问题
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT ',' + QUOTENAME(id)
from #WorkflowStatus
group by id, Name
order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @query = '
WITH Pivoted
AS
(
SELECT OldStatus, '+ @cols +' FROM
#WorkflowStatus a
LEFT JOIN #WorkflowMatrix b
ON a.id = b.NextStatus
PIVOT
(
COUNT(NextStatus)
for NextStatus in (' + @cols + ')
) p
)
SELECT OldStatus,'+@cols+'
FROM Pivoted a
WHERE OldStatus IS NOT NULL
GROUP BY OldStatus,'+ @cols +'
ORDER BY OldStatus ASC
';
exec sp_executesql @query;
我希望我能帮忙。
这是谢谢。但在WorkflowStatus表中,状态的数量不是固定的。如果列是以编程方式生成的,那就更好了。但在WorkflowStatus表中,状态的数量不是固定的。如果列是以编程方式生成的,那就更好了。但在WorkflowStatus表中,状态的数量不是固定的。最好是以编程方式生成列。我不知道如何使用Pivot在这种情况下,我会使用动态查询,并将查询构建为Prdp的答案谢谢。但在WorkflowStatus表中,状态的数量不是固定的。最好是以编程方式生成列。我不知道如何使用Pivot在这种情况下,我会使用一个动态查询,并构建一个看起来像Prdp答案的查询
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT ',' + QUOTENAME(id)
from #WorkflowStatus
group by id, Name
order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @query = '
WITH Pivoted
AS
(
SELECT OldStatus, '+ @cols +' FROM
#WorkflowStatus a
LEFT JOIN #WorkflowMatrix b
ON a.id = b.NextStatus
PIVOT
(
COUNT(NextStatus)
for NextStatus in (' + @cols + ')
) p
)
SELECT OldStatus,'+@cols+'
FROM Pivoted a
WHERE OldStatus IS NOT NULL
GROUP BY OldStatus,'+ @cols +'
ORDER BY OldStatus ASC
';
exec sp_executesql @query;