Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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中将多行中的行转换为列_Sql_Sql Server - Fatal编程技术网

在Sql Server中将多行中的行转换为列

在Sql Server中将多行中的行转换为列,sql,sql-server,Sql,Sql Server,我有一张这样的桌子 CREATE table #yourtable ([Id] int, [Value] varchar(16), [ColumnName] varchar(13), [RecId] varchar(5)); INSERT INTO #yourtable ([Id], [Value], [ColumnName], [RecId]) VALUES (1, 'John', 'FirstName', '1'), (2, '2.4', 'Amount', '1'), (3, 'ZH1E

我有一张这样的桌子

CREATE table #yourtable
([Id] int, [Value] varchar(16), [ColumnName] varchar(13), [RecId] varchar(5));

INSERT INTO #yourtable
([Id], [Value], [ColumnName], [RecId])
VALUES
(1, 'John', 'FirstName', '1'),
(2, '2.4', 'Amount', '1'),
(3, 'ZH1E4A', 'PostalCode', '1'),
(4, 'Fork', 'LastName', '1'),
(5, '857685', 'AccountNumber', '1'),
(6, 'Bill', 'FirstName', '2'),
(7, '4.2', 'Amount', '2'),
(8, '48122', 'PostalCode', '2'),
(9, 'White', 'LastName', '2'),
(10, '129845', 'AccountNumber', '2');
我需要两排像这样的

CREATE table #yourtable
([Id] int, [Value] varchar(16), [ColumnName] varchar(13), [RecId] varchar(5));

INSERT INTO #yourtable
([Id], [Value], [ColumnName], [RecId])
VALUES
(1, 'John', 'FirstName', '1'),
(2, '2.4', 'Amount', '1'),
(3, 'ZH1E4A', 'PostalCode', '1'),
(4, 'Fork', 'LastName', '1'),
(5, '857685', 'AccountNumber', '1'),
(6, 'Bill', 'FirstName', '2'),
(7, '4.2', 'Amount', '2'),
(8, '48122', 'PostalCode', '2'),
(9, 'White', 'LastName', '2'),
(10, '129845', 'AccountNumber', '2');

我们需要一个有效的模式,因为我有很多行。谢谢您的帮助。

您可以使用:

SELECT [FirstName], [Amount], [PostalCode], 
       [LastName], [AccountNumber]
FROM (
   SELECT RecId, Value, ColumnName
   FROM #yourtable) AS src
PIVOT (
   MAX(Value) FOR ColumnName IN ([FirstName], [Amount], [PostalCode], 
                                 [LastName], [AccountNumber])) AS pvt

另一种方法是使用交叉表或条件聚合:

SELECT  
      MAX(CASE WHEN ColumnName = 'FirstName' THEN Value END) AS [FirstName]
    , MAX(CASE WHEN ColumnName = 'Amount' THEN Value END) AS [Amount]
    , MAX(CASE WHEN ColumnName = 'PostalCode' THEN Value END) AS [PostalCode]
    , MAX(CASE WHEN ColumnName = 'LastName' THEN Value END) AS [LastName]
    , MAX(CASE WHEN ColumnName = 'AccountNumber' THEN Value END) AS [AccountNumber]
FROM #yourtable
GROUP BY RecId;
但是,如果您有未知数量的
ColumnName
s,则应动态执行此操作:

DECLARE @sql NVARCHAR(MAX);

SELECT @sql =
'SELECT ' + CHAR(10) +
(SELECT STUFF((SELECT
'   , MAX(CASE WHEN ColumnName = ''' + ColumnName + ''' THEN Value END) AS ' + QUOTENAME(ColumnName) + CHAR(10)
FROM #yourtable
GROUP BY ColumnName
ORDER BY MIN(Id)
FOR XML PATH('')
), 1, 2, '')) +
'FROM #yourtable
GROUP BY RecId;';

PRINT (@sql);
EXEC (@sql);

参考:

  • 杰夫·摩登

向我们展示您迄今为止的尝试。