Sql server Sql Server如何在另一条记录中存储字段的值
我使用UNION从两个数据库中提取数据。我创建了一个名为Ccode的字段来指示记录来自哪个数据库。然后,我使用CASE语句创建另一个名为Elmin的字段,并根据Account字段使用Balance字段(另一个计算字段)填充它。 我想做的是为一条记录(其中Account=1113)获取Elimn字段的值,并将其复制到Account=3104的记录中(我将一家公司的应收账款与另一家公司的应付账款进行抵销),有什么方法可以做到这一点吗 我曾考虑使用一个变量,但我似乎不知道如何将一个计算字段放入一个变量中,因为它需要如此复杂的Select语句(使用联接、多个字段和计算) 我不想保存数据!!请不要用Alter table或Insert等回答我。我只想显示结果。 有什么想法吗 电流输出:Sql server Sql Server如何在另一条记录中存储字段的值,sql-server,Sql Server,我使用UNION从两个数据库中提取数据。我创建了一个名为Ccode的字段来指示记录来自哪个数据库。然后,我使用CASE语句创建另一个名为Elmin的字段,并根据Account字段使用Balance字段(另一个计算字段)填充它。 我想做的是为一条记录(其中Account=1113)获取Elimn字段的值,并将其复制到Account=3104的记录中(我将一家公司的应收账款与另一家公司的应付账款进行抵销),有什么方法可以做到这一点吗 我曾考虑使用一个变量,但我似乎不知道如何将一个计算字段放入一个变量
Account AcctName Ccode Balance Elmin
1112 Accounts Receivable - (U.S.) C 1250923.94 0
1112 Accounts Receivable (U.S.) U 0 0
1113 Accounts Receivable - I/C U 223780.55 223780.55
3104 Accounts Payable - I/C C -254000 0
希望:
Account AcctName Ccode Balance Elmin
1112 Accounts Receivable - (U.S.) C 1250923.94 0
1112 Accounts Receivable (U.S.) U 0 0
1113 Accounts Receivable - I/C U 223780.55 223780.55
3104 Accounts Payable - I/C C -254000 223780.55
SELECT T1.Account, T2.AcctName, 'U' AS Ccode, SUM(T1.Debit - T1.Credit) AS 'Balance',
CASE
WHEN T1.Account IN (1113) THEN SUM(T1.Debit - T1.Credit) ELSE 0
END AS Elmin
FROM OJDT AS T0 INNER JOIN
JDT1 AS T1 ON T0.TransId = T1.TransId INNER JOIN
OACT AS T2 ON T1.Account = T2.AcctCode
WHERE (CAST(T0.RefDate AS date) >= @Start_Date) AND (CAST(T0.RefDate AS date) <= @End_Date) AND (T2.GroupMask IN ('1', '2', '3'))
GROUP BY T1.Account, T2.AcctName, T2.GroupMask, T2.FatherNum
union all
SELECT T1.Account, T2.AcctName, 'C' AS Ccode, SUM(T1.Debit - T1.Credit) AS 'Balance',
CASE WHEN T1.Account IN (1251) THEN SUM(T1.Debit - T1.Credit) ELSE 0
END AS Elmin
FROM CANADACO.dbo.OJDT AS T0 INNER JOIN
CANADACO.dbo.JDT1 AS T1 ON T0.TransId = T1.TransId INNER JOIN
CANADACO.dbo.OACT AS T2 ON T1.Account = T2.AcctCode
WHERE (CAST(T0.RefDate AS date) >= @Start_Date) AND (CAST(T0.RefDate AS date) <= @End_Date) AND (T2.GroupMask IN ('1', '2', '3'))
GROUP BY T1.Account, T2.AcctName, T2.GroupMask, T2.FatherNum
ORDER BY T1.Account
代码:
Account AcctName Ccode Balance Elmin
1112 Accounts Receivable - (U.S.) C 1250923.94 0
1112 Accounts Receivable (U.S.) U 0 0
1113 Accounts Receivable - I/C U 223780.55 223780.55
3104 Accounts Payable - I/C C -254000 223780.55
SELECT T1.Account, T2.AcctName, 'U' AS Ccode, SUM(T1.Debit - T1.Credit) AS 'Balance',
CASE
WHEN T1.Account IN (1113) THEN SUM(T1.Debit - T1.Credit) ELSE 0
END AS Elmin
FROM OJDT AS T0 INNER JOIN
JDT1 AS T1 ON T0.TransId = T1.TransId INNER JOIN
OACT AS T2 ON T1.Account = T2.AcctCode
WHERE (CAST(T0.RefDate AS date) >= @Start_Date) AND (CAST(T0.RefDate AS date) <= @End_Date) AND (T2.GroupMask IN ('1', '2', '3'))
GROUP BY T1.Account, T2.AcctName, T2.GroupMask, T2.FatherNum
union all
SELECT T1.Account, T2.AcctName, 'C' AS Ccode, SUM(T1.Debit - T1.Credit) AS 'Balance',
CASE WHEN T1.Account IN (1251) THEN SUM(T1.Debit - T1.Credit) ELSE 0
END AS Elmin
FROM CANADACO.dbo.OJDT AS T0 INNER JOIN
CANADACO.dbo.JDT1 AS T1 ON T0.TransId = T1.TransId INNER JOIN
CANADACO.dbo.OACT AS T2 ON T1.Account = T2.AcctCode
WHERE (CAST(T0.RefDate AS date) >= @Start_Date) AND (CAST(T0.RefDate AS date) <= @End_Date) AND (T2.GroupMask IN ('1', '2', '3'))
GROUP BY T1.Account, T2.AcctName, T2.GroupMask, T2.FatherNum
ORDER BY T1.Account
选择T1.科目,T2.科目名称,“U”作为科目代码,总和(T1.借方-T1.贷方)作为“余额”,
案例
当T1.账户在(1113)中时,则求和(T1.借方-T1.贷方)否则为0
以埃尔明结束
从OJDT到T0内部连接
JDT1作为T0.TransId=T1.TransId内部连接上的T1
OACT作为T1上的T2。帐户=T2.AcctCode
其中(CAST(T0.RefDate AS date)>=@Start_date)和(CAST(T0.RefDate AS date)=@Start_date)和(CAST(T0.RefDate AS date)您可以将这些子查询包装到公共表表达式(CTE)中。这将为您提供单独的结果集,以与union all
和交叉应用相结合
样本数据
简化数据,但Elmin
仍然可以是计算字段
declare @Database1Table table
(
Account int,
Ccode nvarchar(1),
Elmin money
);
insert into @Database1Table (Account, Ccode, Elmin) values
(1112, 'U', 0.0),
(1113, 'U', 223780.55);
declare @Database2Table table
(
Account int,
Ccode nvarchar(1),
Elmin money
);
insert into @Database2Table (Account, Ccode, Elmin) values
(1112, 'C', 0.0),
(3104, 'C', 0.0);
简化查询,Elmin
计算为总和:
select d1.Account, d1.Ccode, sum(d1.Elmin) as Elmin
from @Database1Table d1
group by d1.Account, d1.Ccode
union all
select d2.Account, d2.Ccode, sum(d2.Elmin) as Elmin
from @Database2Table d2
group by d2.Account, d2.Ccode
order by d1.Account;
当前结果:
Account Ccode Elmin
----------- ----- ---------------------
1112 C 0,00
1112 U 0,00
1113 U 223780,55
3104 C 0,00
解决方案
将子查询移动到两个CTE(CTE_d1
和CTE_d2
)中。使用交叉应用
获取Account=3104
行(case
表达式)的替换值
这使得:
Account Ccode Elmin
----------- ----- ---------------------
1112 C 0,00
1112 U 0,00
1113 U 223780,55
3104 C 223780,55
我强烈建议一个更好的别名策略。就像你在UNION上面的代码中写了1113一样……3104不能也被显式添加吗?