如何在SQL中将行转换为列?

时间:2015-05-12 08:29:27

标签: sql-server

我有一个存储过程(连接两个表并选择where @GID),想要将表结果从行转换为列。我使用动态数据透视查询。

我的存储过程:

enter image description here

尝试使用pivot

enter image description here

我想要这样的结果:

GROUP_MOD_ID   ADD  EDIT  DELETE  ETC...
---------------------------------------    
G02            1     1    0      ....

你能给我一些建议吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

这是因为您正在使用批处理分隔符来分隔查询。这意味着@GID的范围不正确。之后删除半结肠:

DECLARE @pivot_cols NVARCHAR(MAX);

在这种情况下,您不需要使用批处理分隔符。程序的逻辑流程意味着您可以毫无问题地省略它们。

编辑:

以下是我设计的编辑代码:

ALTER PROCEDURE GET_COLUMN_VALUE @GID CHAR(3)
AS
BEGIN

    DECLARE @PivotCols NVARCHAR(MAX)

    SELECT @PivotCols = STUFF((SELECT DISTINCT ' , ' + QUOTENAME(B.FUNCTION_MOD_NAME)
    FROM FUNCTION_GROUP AS A
    JOIN FUNCTION_MOD B
    ON A.FUNCTION_MOD_ID = B.FUNCTION_MOD_ID
    WHERE A.GROUP_MOD_ID = @GID
    FOR XML PATH (' '), TYPE).value(' . ', 'NVARCHAR(MAX) '), 1, 1, ' ')

    DECLARE @PivotQuery NVARCHAR(MAX)

    SET @PivotQuery = '
    ;WITH CTE AS (
    SELECT A.GROUP_MOD_ID, B.FUNCTION_MOD_NAME, CAST(ALLOW AS BIT) AS ALLOW
    FROM FUNCTION_GROUP AS A
    JOIN FUNCTION_MOD AS B
    ON A.FUNCTION_MOD_ID = B.FUNCTION_MOD_ID)
    SELECT GROUP_MOD_ID, '+@PivotCols+'
    FROM CTE
    PIVOT (MAX(ALLOW) FOR FUNCTION_MOD_NAME IN ('+@PivotCols')) AS PIV'
    PRINT @PivotQuery
    EXEC (@PivotQuery)

END

EDIT2:

您应该像这样执行此存储过程:

EXEC GET_COLUMN_VALUE @GID='G02'