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