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'后面的空格