Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 sqlserver中的动态表创建_Sql Server_Stored Procedures_Pivot - Fatal编程技术网

Sql server sqlserver中的动态表创建

Sql server sqlserver中的动态表创建,sql-server,stored-procedures,pivot,Sql Server,Stored Procedures,Pivot,我有这样的情况 +---------+-----------+------------+ | FieldNo | FieldName | Substring | +---------+-----------+------------+ | 1 | A | 8 | | 1 | A | A | | 1 | A | DC | | 2 | B

我有这样的情况

+---------+-----------+------------+
| FieldNo | FieldName | Substring  |
+---------+-----------+------------+
|       1 | A         | 8          |
|       1 | A         | A          |
|       1 | A         | DC         |
|       2 | B         | 7          |
|       3 | C         | 22         |
|       3 | C         | 37         |
+---------+-----------+------------+
需要这样的输出:

+----+------+------+
| A  |  B   |  C   |
+----+------+------+
| 8  | 7    | 22   |
| A  | Null | 37   |
| DC | Null | Null |
+----+------+------+
对如何在SQL Server中执行此操作有何建议

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(Field_name) 
                    from bear_crossjoin
                    group by FIELD_NAME, FIELDNUMBER
                    order by FIELDNUMBER
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from 
             (
                select substring, Field_name
                from bear_crossjoin
            ) x
            pivot 
            (
                max(substring)
                for field_name in (' + @cols + N')
            ) p '

exec sp_executesql @query

似乎您正在尝试按行号而不是直接按字段名进行透视。下面的方法使用行号来获得所需的输出:

DECLARE @Data TABLE (FieldNo INT, FieldName VARCHAR(50), [Substring] VARCHAR(500))
INSERT @Data VALUES
    (1, 'A', '8'),
    (1, 'A', 'A'),
    (1, 'A', 'DC'),
    (2, 'B', '7'),
    (3, 'C', '22'),
    (3, 'C', '37')

;WITH DataRows AS (
    SELECT
        FieldName,
        [Substring],
        ROW_NUMBER() OVER (PARTITION BY FieldNo ORDER BY FieldName, [Substring]) AS RowNum
    FROM @Data
)
    SELECT
        CONVERT(VARCHAR(10), [A]) AS [A],
        CONVERT(VARCHAR(10), [B]) AS [B],
        CONVERT(VARCHAR(10), [C]) AS [C]
    FROM DataRows
        PIVOT (MAX([Substring]) FOR FieldName IN ([A], [B], [C])) T
A          B          C
---------- ---------- ----------
8          7          22
A          NULL       37
DC         NULL       NULL
这将产生所需的输出:

DECLARE @Data TABLE (FieldNo INT, FieldName VARCHAR(50), [Substring] VARCHAR(500))
INSERT @Data VALUES
    (1, 'A', '8'),
    (1, 'A', 'A'),
    (1, 'A', 'DC'),
    (2, 'B', '7'),
    (3, 'C', '22'),
    (3, 'C', '37')

;WITH DataRows AS (
    SELECT
        FieldName,
        [Substring],
        ROW_NUMBER() OVER (PARTITION BY FieldNo ORDER BY FieldName, [Substring]) AS RowNum
    FROM @Data
)
    SELECT
        CONVERT(VARCHAR(10), [A]) AS [A],
        CONVERT(VARCHAR(10), [B]) AS [B],
        CONVERT(VARCHAR(10), [C]) AS [C]
    FROM DataRows
        PIVOT (MAX([Substring]) FOR FieldName IN ([A], [B], [C])) T
A          B          C
---------- ---------- ----------
8          7          22
A          NULL       37
DC         NULL       NULL

似乎您正在尝试按行号而不是直接按字段名进行透视。下面的方法使用行号来获得所需的输出:

DECLARE @Data TABLE (FieldNo INT, FieldName VARCHAR(50), [Substring] VARCHAR(500))
INSERT @Data VALUES
    (1, 'A', '8'),
    (1, 'A', 'A'),
    (1, 'A', 'DC'),
    (2, 'B', '7'),
    (3, 'C', '22'),
    (3, 'C', '37')

;WITH DataRows AS (
    SELECT
        FieldName,
        [Substring],
        ROW_NUMBER() OVER (PARTITION BY FieldNo ORDER BY FieldName, [Substring]) AS RowNum
    FROM @Data
)
    SELECT
        CONVERT(VARCHAR(10), [A]) AS [A],
        CONVERT(VARCHAR(10), [B]) AS [B],
        CONVERT(VARCHAR(10), [C]) AS [C]
    FROM DataRows
        PIVOT (MAX([Substring]) FOR FieldName IN ([A], [B], [C])) T
A          B          C
---------- ---------- ----------
8          7          22
A          NULL       37
DC         NULL       NULL
这将产生所需的输出:

DECLARE @Data TABLE (FieldNo INT, FieldName VARCHAR(50), [Substring] VARCHAR(500))
INSERT @Data VALUES
    (1, 'A', '8'),
    (1, 'A', 'A'),
    (1, 'A', 'DC'),
    (2, 'B', '7'),
    (3, 'C', '22'),
    (3, 'C', '37')

;WITH DataRows AS (
    SELECT
        FieldName,
        [Substring],
        ROW_NUMBER() OVER (PARTITION BY FieldNo ORDER BY FieldName, [Substring]) AS RowNum
    FROM @Data
)
    SELECT
        CONVERT(VARCHAR(10), [A]) AS [A],
        CONVERT(VARCHAR(10), [B]) AS [B],
        CONVERT(VARCHAR(10), [C]) AS [C]
    FROM DataRows
        PIVOT (MAX([Substring]) FOR FieldName IN ([A], [B], [C])) T
A          B          C
---------- ---------- ----------
8          7          22
A          NULL       37
DC         NULL       NULL

我假定表名为tblTemp。试试这个

DECLARE @colList NVARCHAR(max)
DECLARE @query NVARCHAR(max)

select @colList = coalesce(@colList + ',', '') +  convert(varchar(12),TT.FIELDNAME)
from (SELECT DISTINCT FIELDNAME FROM tblTemp) TT
order by TT.FIELDNAME


SET @query = 'SELECT ' + @colList + ' FROM
(
SELECT row_number() over(partition by FIELDNO
                        order by FIELDNO) seq,
       FieldName, [Substring]
FROM tblTemp ) als
PIVOT
( MAX([SUBSTRING])
  FOR FieldName IN (' + @colList + ')
) piv'

exec sp_executesql @query

我假定表名为tblTemp。试试这个

DECLARE @colList NVARCHAR(max)
DECLARE @query NVARCHAR(max)

select @colList = coalesce(@colList + ',', '') +  convert(varchar(12),TT.FIELDNAME)
from (SELECT DISTINCT FIELDNAME FROM tblTemp) TT
order by TT.FIELDNAME


SET @query = 'SELECT ' + @colList + ' FROM
(
SELECT row_number() over(partition by FIELDNO
                        order by FIELDNO) seq,
       FieldName, [Substring]
FROM tblTemp ) als
PIVOT
( MAX([SUBSTRING])
  FOR FieldName IN (' + @colList + ')
) piv'

exec sp_executesql @query


只需搜索SQL Server和PIVOT。请随时询问您是否有具体问题。我需要在顶部显示字段名A、B、C。上面的例子是以行而不是列的形式给出的。您是否检查过关于PIVOT的任何类似问题?你对他们有问题吗?@Arun.K你可以利用行数技巧和我的答案,其中包括一个动态解决方案。基本上,您需要创建一个sql字符串,该字符串将被执行,并给出最终结果。@Arun.K-代码可以进行细微的更改-请参阅此演示-只需搜索sql Server和PIVOT即可。请随时询问您是否有具体问题。我需要在顶部显示字段名A、B、C。上面的例子是以行而不是列的形式给出的。您是否检查过关于PIVOT的任何类似问题?你对他们有问题吗?@Arun.K你可以利用行数技巧和我的答案,其中包括一个动态解决方案。基本上,您需要创建一个sql字符串,该字符串将被执行,并给出最终结果。@Arun.K-代码可以进行一些小的更改-请参阅此演示-Jason,我应该在[a]、[B]、[C]T中为FieldName提些什么,因为我有大约978列。您刚才说的是978列吗?如果是,请使用动态sql。我想这是唯一的选择是978列。我需要一个动态sql,我给出的示例很少。关于动态sql有什么建议吗?请参阅我对动态sql和pivotJason的回答,我在[a]、[B]、[C]T中的FieldName应该提到什么,因为我有大约978列。你刚才说的是978列吗?如果是,请使用动态sql。我想这是唯一的选择是978列。我需要一个动态sql,我给出的示例很少。对动态sql有什么建议吗?请参阅我的动态sql和PivotSprowing error的答案。必须声明标量变量@results@Arun.K如果不显示正在使用的代码,没有人能提供帮助。你从哪里得到@结果?这个答案甚至不包括那个变量。我的错是,我先用了@results,但为了更好地理解,我把它改成了colList。所做的编辑:VARCHAR到NVARCHAR,以及:query='SELECT'后面的空格。抛出错误必须声明标量变量@results。@Arun.K如果不显示正在使用的代码,没有人能够提供帮助。你从哪里得到@结果?这个答案甚至不包括那个变量。我的错是,我先用了@results,但为了更好地理解,我把它改成了colList。所做的编辑:VARCHAR到NVARCHAR,以及:query='SELECT'后面的空格