首页 > 解决方案 > 如何将特定列变为行并更改 SQL 中的特定值

问题描述

我知道标题很模糊,但我不知道如何更好地解释这个问题,如果您有任何建议,请告诉我。

我有这张桌子:

CRAccountID DBAccountID 值

我想为每个 CRAccountID 和 DBAccountID 设置一行,例如:

CRAccountID DBAccountID Value
100          111         10

我想得到这些记录:

AccountID  Value
100         10
111        -10

如果您还没有注意到,我还想将 DBAccountID 值设为负值。

我通过选择它们并做一个来尝试它,Union但是当表变大时它需要太多时间(表可以包含超过 400 万条记录)

这是我的代码:

select CRAccountID as AccountID, Value from MyTable
UNION
select DBAccountID as AccountID, -Value as Value from MyTable

注意:我的代码比这要大得多,每个联合中几乎有 4 个连接,因此它变得如此缓慢。

我正在使用 Microsoft SQL。

标签: sqlsql-server

解决方案


您想要取消透视数据。我会推荐apply

select v.account, v.value
from t cross apply
     (values (t.CRAccountID, t.value),
             (t.DBAccountID, - t.value)
     ) v(account, value) ;

您可以将您的复合体表示为 CTE 或子查询。或者只是将其包含在cross apply.


推荐阅读