Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 SQL Pivot如何用于矩阵视图和多表_Sql Server_Pivot - Fatal编程技术网

Sql server SQL Pivot如何用于矩阵视图和多表

Sql server SQL Pivot如何用于矩阵视图和多表,sql-server,pivot,Sql Server,Pivot,问题:我有两个表,如下所示,我想从中查看矩阵 WorkflowStatus(状态编号可由用户定义) 工作流矩阵 问题:如何在SQL中使用Pivot命令查看结果,如下所示 | Draft | Submitted | Approved | Rejected | Closed ========================================================================= 1 Draft

问题:我有两个表,如下所示,我想从中查看矩阵

  • WorkflowStatus(状态编号可由用户定义)
  • 工作流矩阵
  • 问题:如何在SQL中使用Pivot命令查看结果,如下所示

                    |  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;