在 SQL 服务器中重新创建交叉表
Recreate Crosstab in SQL Server
我有一个 table 是这样的:
FILENO CODE FIELD
FILE1 *CODE1 SOK
FILE1 *CODE2 AUTO
FILE1 *CODE3 CTY
FILE2 *CODE1 SOK
FILE2 *CODE2 AR
FILE2 *CODE3 CTN
FILE3 *CODE1 SOKN
FILE3 *CODE2 AUTO
FILE3 *CODE3 CTN
我想在视图中重新创建或像这样 table 新的:
FILENO *CODE1 *CODE2 *CODE3
FILE1 SOK AUTO CTY
FILE2 SOK AR CTN
FILE3 SOKN AUTO CTN
本质上是一个交叉表查询,但我不确定如何在 SSMS 中完成此操作。
有什么指点吗?
你可以用CASE
表达式来实现。
查询
SELECT [FILENO],
MAX(CASE CODE WHEN '*CODE1' THEN FIELD END) AS [*CODE1],
MAX(CASE CODE WHEN '*CODE2' THEN FIELD END) AS [*CODE2],
MAX(CASE CODE WHEN '*CODE3' THEN FIELD END) AS [*CODE3]
FROM [your_table_name]
GROUP BY [FILENO];
或者您可以使用动态 sql 查询来提高效率。
DECLARE @sql AS VARCHAR(MAX);
SELECT @sql = 'SELECT [FILENO], '
+ STUFF((SELECT DISTINCT ', MAX(CASE [CODE]
WHEN ''' + [CODE] + '''
THEN [FIELD] END) AS [' + [CODE] + ']'
FROM [your_table_name]
FOR XML PATH('')
), 1, 2, '')
+' FROM [your_table_name] GROUP BY [FIELDNO]';
EXEC(@sql);
这是一个非常基础的 PIVOT
。
Select [FILENO],[*CODE1],[*CODE2],[*CODE3]
From (Select FileNo,Code,Field from YourTable) A
Pivot (max(FIELD) For CODE in ([*CODE1],[*CODE2],[*CODE3]) ) p
Returns
FILENO *CODE1 *CODE2 *CODE3
FILE1 SOK AUTO CTY
FILE2 SOK AR CTN
FILE3 SOKN AUTO CTN
对于动态版本
Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([Code]) From YourTable Order by 1 For XML Path('')),1,1,'')
Select @SQL = '
Select [FILENO],' + @SQL + '
From (Select FileNo,Code,Field from YourTable) A
Pivot (max(FIELD) For [CODE] in (' + @SQL + ') ) p'
Exec(@SQL);
我有一个 table 是这样的:
FILENO CODE FIELD
FILE1 *CODE1 SOK
FILE1 *CODE2 AUTO
FILE1 *CODE3 CTY
FILE2 *CODE1 SOK
FILE2 *CODE2 AR
FILE2 *CODE3 CTN
FILE3 *CODE1 SOKN
FILE3 *CODE2 AUTO
FILE3 *CODE3 CTN
我想在视图中重新创建或像这样 table 新的:
FILENO *CODE1 *CODE2 *CODE3
FILE1 SOK AUTO CTY
FILE2 SOK AR CTN
FILE3 SOKN AUTO CTN
本质上是一个交叉表查询,但我不确定如何在 SSMS 中完成此操作。
有什么指点吗?
你可以用CASE
表达式来实现。
查询
SELECT [FILENO],
MAX(CASE CODE WHEN '*CODE1' THEN FIELD END) AS [*CODE1],
MAX(CASE CODE WHEN '*CODE2' THEN FIELD END) AS [*CODE2],
MAX(CASE CODE WHEN '*CODE3' THEN FIELD END) AS [*CODE3]
FROM [your_table_name]
GROUP BY [FILENO];
或者您可以使用动态 sql 查询来提高效率。
DECLARE @sql AS VARCHAR(MAX);
SELECT @sql = 'SELECT [FILENO], '
+ STUFF((SELECT DISTINCT ', MAX(CASE [CODE]
WHEN ''' + [CODE] + '''
THEN [FIELD] END) AS [' + [CODE] + ']'
FROM [your_table_name]
FOR XML PATH('')
), 1, 2, '')
+' FROM [your_table_name] GROUP BY [FIELDNO]';
EXEC(@sql);
这是一个非常基础的 PIVOT
。
Select [FILENO],[*CODE1],[*CODE2],[*CODE3]
From (Select FileNo,Code,Field from YourTable) A
Pivot (max(FIELD) For CODE in ([*CODE1],[*CODE2],[*CODE3]) ) p
Returns
FILENO *CODE1 *CODE2 *CODE3
FILE1 SOK AUTO CTY
FILE2 SOK AR CTN
FILE3 SOKN AUTO CTN
对于动态版本
Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([Code]) From YourTable Order by 1 For XML Path('')),1,1,'')
Select @SQL = '
Select [FILENO],' + @SQL + '
From (Select FileNo,Code,Field from YourTable) A
Pivot (max(FIELD) For [CODE] in (' + @SQL + ') ) p'
Exec(@SQL);