Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 透视并复制表中的某些列_Sql_Sql Server_Tsql_Sql Server 2012_Pivot - Fatal编程技术网

Sql 透视并复制表中的某些列

Sql 透视并复制表中的某些列,sql,sql-server,tsql,sql-server-2012,pivot,Sql,Sql Server,Tsql,Sql Server 2012,Pivot,我有一个FormSummary表格: formID formName Version ReleaseDate Location ======================================================== AA-01 PAYMENTS 1.3 1/1/2012 CA AA-02 LOANS 1.4 2/1/2012 CA AA-03 ADVAN

我有一个
FormSummary
表格:

formID    formName    Version    ReleaseDate    Location
========================================================
AA-01     PAYMENTS    1.3         1/1/2012      CA
AA-02     LOANS       1.4         2/1/2012      CA
AA-03     ADVANCES    1.6         3/20/2012     CA
AA-01     PAYMENTS    1.2         12/1/2011     US
AA-02     LOANS       1.4         2/1/2012      US
AA-03     ADVANCES    1.6         3/20/2012     US
AA-01     PAYMENTS    1.3         12/1/2012     PH
AA-02     LOANS       1.4         2/1/2012      PH
AA-03     ADVANCES    1.5         2/14/2012     PH
如何旋转
location
列,以便获得以下输出:

formID    formName    Version (CA)    ReleaseDate (CA)    Version (US)    ReleaseDate (US)    Version (PH)    ReleaseDate (PH)
==============================================================================================================================
AA-01     PAYMENTS    1.3             1/1/2012            1.2             12/1/2011           1.3             12/1/2012
AA-02     LOANS       1.4             2/1/2012            1.4             2/1/2012            1.4             2/1/2012
AA-03     ADVANCES    1.6             3/20/2012           1.6             3/20/2012           1.5             2/14/2012
创建表的脚本:

CREATE TABLE #FormSummary (
    formID nvarchar(5), 
    formName nvarchar(max), 
    [Version] float, 
    ReleaseDate date, 
    [Location] nvarchar(2)
)

INSERT INTO #FormSummary VALUES
('AA-01', 'PAYMENTS', 1.3, '1/1/2012', 'CA'),
('AA-02', 'LOANS', 1.4, '2/1/2012', 'CA'),
('AA-03', 'ADVANCES', 1.6, '3/20/2012', 'CA'),
('AA-01', 'PAYMENTS', 1.2, '12/1/2011', 'US'),
('AA-02', 'LOANS', 1.4, '2/1/2012', 'US'),
('AA-03', 'ADVANCES', 1.6, '3/20/2012', 'US'),
('AA-01', 'PAYMENTS', 1.3, '12/1/2012', 'PH'),
('AA-02', 'LOANS', 1.4, '2/1/2012', 'PH'),
('AA-03', 'ADVANCES', 1.5, '2/14/2012', 'PH')
首先使用table获取列名。然后将它们与
Location
s交叉连接,以获得如下列名

,[Version (CA)],[ReleaseDate (CA)],[Version (PH)],[ReleaseDate (PH)],[Version (US)],[ReleaseDate (US)]
然后使用UNPIVOT使表格如下所示:

formID  formName    Columns             Values
AA-01   PAYMENTS    Version (CA)        1.3
AA-01   PAYMENTS    ReleaseDate (CA)    2012-01-01
AA-02   LOANS       Version (CA)        1.4
...
AA-03   ADVANCES    Version (PH)        1.5
AA-03   ADVANCES    ReleaseDate (PH)    2012-02-14
然后对存储在
@col

此脚本将为您提供所需的内容:

DECLARE @sql nvarchar(max),
        @col nvarchar(max)

SELECT @col = (
    SELECT ',' + QUOTENAME([name]+ ' ('+[Location]+')')
    FROM sys.columns c
    CROSS JOIN (
        SELECT DISTINCT [Location] 
        FROM #FormSummary
        ) as f
    WHERE c.[object_id] = OBJECT_ID(N'#FormSummary') and c.column_id > 2 and [name] != 'Location'
    ORDER BY [Location]
    FOR XML PATH('')
)

SELECT @sql = N'
SELECT *
FROM (
    SELECT  formID, 
            formName,
            [Columns] + '' (''+[Location]+'')'' as [Columns],
            [Values]
    FROM (
        SELECT  formID, 
                formName, 
                CAST([Version] as nvarchar(max)) [Version], 
                CAST(ReleaseDate as nvarchar(max)) ReleaseDate, 
                CAST([Location] as nvarchar(max)) [Location]
        FROM #FormSummary
    ) as t
    UNPIVOT (
        [Values] FOR [Columns] IN ([Version], ReleaseDate)
    ) as unpvt
) as d
PIVOT (
    MAX([Values]) FOR [Columns] IN ('+STUFF(@col,1,1,'')+')
) as pvt'

EXEC sp_executesql @sql
输出:

formID  formName    Version (CA)    ReleaseDate (CA)    Version (PH)    ReleaseDate (PH)    Version (US)    ReleaseDate (US)
AA-03   ADVANCES    1.6             2012-03-20          1.5             2012-02-14          1.6             2012-03-20
AA-02   LOANS       1.4             2012-02-01          1.4             2012-02-01          1.4             2012-02-01
AA-01   PAYMENTS    1.3             2012-01-01          1.3             2012-12-01          1.2             2011-12-01

这似乎是一项基本的动态轴心任务。看看堆栈溢出,你们会找到解决方案。@EvaldasBuinauskas是的,但我找不到关于基于数据透视字段的列分隔的动态数据透视的文章。这正是我需要的。非常感谢你!