Sql 列到行,而不取消PIVOT

Sql 列到行,而不取消PIVOT,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要这样的输出: DECLARE @temp TABLE(Client_ID INT, Data_DT VARCHAR(20), Amt_1 INT, Amt_2 INT, Amt_3 INT, Amt_4 INT, Amt_5 INT) INSERT INTO @tempVALUES (1, '082014', 100, 0, 200, 300, 0) 不使用UNPIVOT可以做到这一点吗?当然可以。最简单的方法是简单地联合所有: 另一种方法是使用交叉应用: 处理大于0的金额的最简单方法

我需要这样的输出:

DECLARE @temp TABLE(Client_ID INT, Data_DT VARCHAR(20), Amt_1 INT, Amt_2 INT, Amt_3 INT, Amt_4 INT, Amt_5 INT)

INSERT INTO @tempVALUES (1, '082014', 100, 0, 200, 300, 0)

不使用UNPIVOT可以做到这一点吗?

当然可以。最简单的方法是简单地联合所有:

另一种方法是使用交叉应用:

处理大于0的金额的最简单方法是:

select t.client_id, t.date_dt, v.amount_col, v.amount
from @temp t cross apply
     (values ('amt_1', amt_1),
             ('amt_2', amt_2),
             ('amt_3', amt_3),
             ('amt_4', amt_4),
             ('amt_5', amt_5)
     ) v(amount_col, amount);

当然。最简单的方法是简单地联合所有:

另一种方法是使用交叉应用:

处理大于0的金额的最简单方法是:

select t.client_id, t.date_dt, v.amount_col, v.amount
from @temp t cross apply
     (values ('amt_1', amt_1),
             ('amt_2', amt_2),
             ('amt_3', amt_3),
             ('amt_4', amt_4),
             ('amt_5', amt_5)
     ) v(amount_col, amount);
使用UNION ALL

使用UNION ALL


您能试试这个吗,唯一的区别是我创建了永久表,以从“INFORMATION\u SCHEMA.COLUMNS”获取列详细信息

使用下面的脚本创建表

SELECT
    Client_ID,
    Data_DT,
    Amount_Col  = 'Amt_1',
    Amount_Val = Amt_1
FROM @temp
UNION ALL
SELECT
    Client_ID,
    Data_DT,
    Amount_Col  = 'Amt_2',
    Amount_Val = Amt_2
FROM @temp
UNION ALL
SELECT
    Client_ID,
    Data_DT,
    Amount_Col  = 'Amt_3',
    Amount_Val = Amt_3
FROM @temp
UNION ALL
SELECT
    Client_ID,
    Data_DT,
    Amount_Col  = 'Amt_4',
    Amount_Val = Amt_4
FROM @temp
UNION ALL
SELECT
    Client_ID,
    Data_DT,
    Amount_Col  = 'Amt_5',
    Amount_Val = Amt_5
FROM @temp
ORDER BY
    Client_ID,
    Data_DT,
    Amount_Col
-Unpivot从Unpivot中排除列column_NAME'Client_ID',只是为了为记录集设置pkey。。根据您的要求进行更改

Create TABLE temp (Client_ID INT, Data_DT VARCHAR(20), Amt_1 INT, Amt_2 INT, Amt_3 INT, Amt_4 INT, Amt_5 INT)
INSERT INTO temp VALUES(1, '082014', 100, 0, 200, 300, 0)
INSERT INTO temp VALUES(2, '082015', 200, 1, 300, 400, 1)

Select * From temp 

您能试试这个吗,唯一的区别是我创建了永久表,以从“INFORMATION\u SCHEMA.COLUMNS”获取列详细信息

使用下面的脚本创建表

SELECT
    Client_ID,
    Data_DT,
    Amount_Col  = 'Amt_1',
    Amount_Val = Amt_1
FROM @temp
UNION ALL
SELECT
    Client_ID,
    Data_DT,
    Amount_Col  = 'Amt_2',
    Amount_Val = Amt_2
FROM @temp
UNION ALL
SELECT
    Client_ID,
    Data_DT,
    Amount_Col  = 'Amt_3',
    Amount_Val = Amt_3
FROM @temp
UNION ALL
SELECT
    Client_ID,
    Data_DT,
    Amount_Col  = 'Amt_4',
    Amount_Val = Amt_4
FROM @temp
UNION ALL
SELECT
    Client_ID,
    Data_DT,
    Amount_Col  = 'Amt_5',
    Amount_Val = Amt_5
FROM @temp
ORDER BY
    Client_ID,
    Data_DT,
    Amount_Col
-Unpivot从Unpivot中排除列column_NAME'Client_ID',只是为了为记录集设置pkey。。根据您的要求进行更改

Create TABLE temp (Client_ID INT, Data_DT VARCHAR(20), Amt_1 INT, Amt_2 INT, Amt_3 INT, Amt_4 INT, Amt_5 INT)
INSERT INTO temp VALUES(1, '082014', 100, 0, 200, 300, 0)
INSERT INTO temp VALUES(2, '082015', 200, 1, 300, 400, 1)

Select * From temp 

设法做到了这一点

SELECT * FROM
(Select t.Client_ID,t.Data_DT,COLUMN_NAME,
     Case
     When COLUMN_NAME='Amt_1' Then t.Amt_1
     When COLUMN_NAME='Amt_2' Then t.Amt_2
     When COLUMN_NAME='Amt_3' Then t.Amt_3
     When COLUMN_NAME='Amt_4' Then t.Amt_4
     When COLUMN_NAME='Amt_5' Then t.Amt_5
     --When COLUMN_NAME='Data_DT' Then t.Data_DT
     End AS [Value]
     From INFORMATION_SCHEMA.COLUMNS C
     CROSS JOIN temp t
     Where TABLE_NAME ='temp' AND C.COLUMN_NAME<>'Client_ID' AND C.COLUMN_NAME<>'Data_DT'

) Result Where Value > 0 Order By Client_ID

设法做到了这一点

SELECT * FROM
(Select t.Client_ID,t.Data_DT,COLUMN_NAME,
     Case
     When COLUMN_NAME='Amt_1' Then t.Amt_1
     When COLUMN_NAME='Amt_2' Then t.Amt_2
     When COLUMN_NAME='Amt_3' Then t.Amt_3
     When COLUMN_NAME='Amt_4' Then t.Amt_4
     When COLUMN_NAME='Amt_5' Then t.Amt_5
     --When COLUMN_NAME='Data_DT' Then t.Data_DT
     End AS [Value]
     From INFORMATION_SCHEMA.COLUMNS C
     CROSS JOIN temp t
     Where TABLE_NAME ='temp' AND C.COLUMN_NAME<>'Client_ID' AND C.COLUMN_NAME<>'Data_DT'

) Result Where Value > 0 Order By Client_ID


谢谢你的回答。我的实际表大约有50列amount。我需要在PDW中使用这个查询。PDW中不支持PIVOT和UNPIVOT。那么你认为我应该选择哪一个呢?@凯旋喷火。如果语法受支持,则两者都可以。union all是标准SQL,因此应该支持它。这张桌子有多大?性能有多重要?PDW中不支持交叉应用。我只需要显示大于零的数量。如何才能做到这一点?谢谢你的回答。我的实际表大约有50列amount。我需要在PDW中使用这个查询。PDW中不支持PIVOT和UNPIVOT。那么你认为我应该选择哪一个呢?@凯旋喷火。如果语法受支持,则两者都可以。union all是标准SQL,因此应该支持它。这张桌子有多大?性能有多重要?PDW中不支持交叉应用。我只需要显示大于零的数量。如何才能做到这一点?提前感谢为什么不使用unpivot?并行数据仓库中不支持unpivot,我正在进行这方面的工作。然后,您可以生成一个动态sql,从子查询筛选器中选择表中的所有列,并使用所需的列,然后使用该数据生成结果。您可以演示如何使用上述数据吗?为什么不使用unpivot?并行数据仓库中不支持UNPIVOT,我正在做这项工作,然后您可以生成一个动态sql,从子查询过滤器中选择表中的所有列,并使用这些数据生成结果。您可以演示如何使用上述数据吗?感谢您的回复Naveen,但是select语句将日期列视为一个值。请参阅我在上面发布的所需输出。我只需要显示大于0的值,然后您也可以忽略日期列。。您可以根据您的要求使用查询,谢谢。你能告诉我如何从上面删除非零值吗?有两种方法,一种是添加另一个t.Amt_1>0和t.Amt_2>0的检查,以此类推。。。另一种方法是我更新答案。。请参见上文。感谢您的回复Naveen,但您的select语句将日期列视为一个值。请参阅我在上面发布的所需输出。我只需要显示大于0的值,然后您也可以忽略日期列。。您可以根据您的要求使用查询,谢谢。你能告诉我如何从上面删除非零值吗?有两种方法,一种是添加另一个t.Amt_1>0和t.Amt_2>0的检查,以此类推。。。另一种方法是我更新答案。。见上文。。