如何使用动态T-SQL数据透视表更改输出

如何使用动态T-SQL数据透视表更改输出,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,Pivot,这是我的桌子 CREATE TABLE tpivot ([col1] varchar(80), [col2] varchar(80), [col3] varchar(80), [col4] varchar(80), [col5] varchar(80)) ; INSERT INTO tpivot ([col1], [col2], [col3], [col4], [col5]) VALUES ('Datum', 'EC', 'Mastercard', 'Postfinan

这是我的桌子

CREATE TABLE tpivot
    ([col1] varchar(80), [col2] varchar(80), [col3] varchar(80), [col4] varchar(80), [col5] varchar(80))
;

INSERT INTO tpivot
    ([col1], [col2], [col3], [col4], [col5])
VALUES
    ('Datum', 'EC', 'Mastercard', 'Postfinance', 'VISA'),
    ('01.12.2014', '-204.9', '-88', '0', '-19'),
    ('02.12.2014', '-352.9', '0', '79.9', '-20'),
    ('03.12.2014', '-105', '-182', '0', '-436'),
    ('04.12.2014', '-371', '-122,9', '-751', '-343')

;
我的目标是扭转局面,使输出看起来像这样

col1         col2         col3        col4        col5
Datum        01.12.2014   02.12.2014  03.12.2014  04.12.2014
EC           -204.9       -352.9      -105        -371
Mastercard  -88           0           -182        -112.9
Postfinance  0            -79.9        0          -751
VISA         -19          -20         -436        -346
我需要有一个动态透视,因为我从一个csv导入的表每次可能有不同数量的列

有人能帮我吗?我甚至无法使用静态轴心:(


谢谢

这是我使用动态SQL的解决方案

IF OBJECT_ID('tPivot') IS NOT NULl
    DROP TABLE tpivot;

CREATE TABLE tpivot
    (ID INT IDENTITY(1,1), [col1] varchar(100), [col2] varchar(100), [col3] varchar(100), [col4] varchar(100), [col5] varchar(100));
INSERT INTO tpivot
    ([col1], [col2], [col3], [col4], [col5])
VALUES
    ('Datum', 'EC', 'Mastercard', 'Postfinance', 'VISA'),
    ('01.12.2014', '-204.9', '-88', '0', '-19'),
    ('02.12.2014', '-352.9', '0', '79.9', '-20'),
    ('03.12.2014', '-105', '-182', '0', '-436'),
    ('04.12.2014', '-371', '-122,9', '-751', '-343');

DECLARE @ColList VARCHAR(MAX),
        @IdList VARCHAR(MAX);

SELECT  @ColList = COALESCE(@ColList + ',','') + QUOTENAME(A.COLUMN_NAME),
        @IdList = COALESCE(@IdList + ',','') + QUOTENAME(ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION))
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE   TABLE_NAME = 'tPivot'
        AND COLUMN_NAME ! ='ID'

--SELECT @ColList
--SELECT @IdList


EXEC (
'WITH CTE
AS
(
    SELECT *
    FROM
    (
        SELECT  ID,
                Column_Name,
                ROW_NUMBER() OVER (PARTITION BY ID ORDER BY col) row_num,
                val
        FROM tPivot A
        INNER JOIN (SELECT Column_Name AS COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''tPivot'' ) B
        ON A.ID = B.ORDINAL_POSITION - 1
        UNPIVOT
        (
            val for col in (' + @colList + ')
        ) unpvt
    ) A
    PIVOT
    (
        MAX(val) FOR column_name IN (' + @colList + ')
    ) pvt
)

SELECT *
FROM
(
    SELECT ID,
            row_num,
            coalesce(' + @colList + ') val
    FROM cte
) A
PIVOT
(
    MAX(val) FOR ID IN (' + @IdList + ')
) pvt'
)

请帮我做这个:(为什么不在导入之前转换现有csv?例如,在Excel中,您可以打开csv,转换整个数据矩阵并保存。有时更改输入格式要比使用错误的工具处理数据容易得多。使用VARCHAR混合不同的数据类型并将其输出到同一数据集中不是一个好做法。请尝试更改输入格式。)解决此任务的方法这并不是真正的旋转。您从列
col1
-
col5
开始,并且您所需的输出具有相同的列。工作非常有魅力,非常感谢。呵呵,我不容易创建此动态,因此如果您愿意帮助我,我将非常感激。我理解。我支持我们ed认为编写动态SQL很糟糕。这都是关于一步一个脚印的练习!所以我要做的就是写出我的脚本,然后寻找需要“动态”的部分喜欢更改列名的数量。我将这些列名称放入变量中。然后在脚本周围添加单引号,并开始放入动态变量。然后我选择“我的代码”,并在新的查询窗口中运行返回的代码。调试它并重试,直到它起作用。一旦它起作用,我将SELECT更改为EXEC(“我的代码”)瞧!动态SQL诞生了!:)