如何使用动态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诞生了!:)