sql - 如何将特定列变为行并更改 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。
解决方案
您想要取消透视数据。我会推荐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
.
推荐阅读
- python - 精灵在一定的距离限制内遵循另一种灵活的方式
- c - 如何“暂停”应用程序让用户按下按钮?GTK
- c++ - 如何在我的 C++ 程序中使用下标数字?
- corda - Corda:如何在 valult DB 中将即时状态变量保存为 UTC?
- r - rbind(x, y) 与 rbind(y, x)
- javascript - 检索 CSS 生成的内容
- nginx-reverse-proxy - 设置 Docker 存储库端口
- azure-functions - Microsoft.Azure.WebJobs.Host 出现默认持久函数错误:无法绑定参数“starter”
- c# - 从联系表发送电子邮件
- data-science-experience - 数据精炼作业失败并出现 SCAPIException CDICO2060E