我有一个查询,看起来或多或少像这样:
INSERT INTO #results
SELECT Name,
(SELECT
SUM(CAST(Amount AS BIGINT))
FROM Items
WHERE RemittingMember = a.Number
and RecordId = 50),
(SELECT SUM(CAST(Std_Amount AS BIGINT))
FROM Items
WHERE RemittingMember = a.Number
AND RecordId = 10)
FROM Member a
其中 Amount
是货币(存储为 varchar,不带小数),RangledMember
是 Items
表和Member
表和 RecordId
指示该行的项目类型。在本例中,50 是借方,10 是贷方。
我需要从第二列中减去第一列,并将该值放在第三列中。我知道我可以这样做:
INSERT INTO #results
SELECT Name,
(SELECT
SUM(CAST(Amount AS BIGINT))
FROM Items
WHERE RemittingMember = a.Number
and RecordId = 50),
(SELECT SUM(CAST(Std_Amount AS BIGINT))
FROM Items
WHERE RemittingMember = a.Number
AND RecordId = 10),
(SELECT
SUM(CAST(Amount AS BIGINT))
FROM Items
WHERE RemittingMember = a.Number
and RecordId = 50) - (SELECT SUM(CAST(Std_Amount AS BIGINT))
FROM Items
WHERE RemittingMember = a.Number
AND RecordId = 10)
FROM Member a
但是,如果需要进行更改,这相当难以阅读并且更改起来很麻烦。我也知道我可以使用局部变量来做到这一点,但这是一个报告,其中 a.Number
将发生变化,这将涉及我想避免的迭代。
我还需要检查第三列的符号以将值放入第四列。
有什么巧妙的方法可以实现这一目标吗?
最佳答案
您可以使用 CTE,如下所示:
;WITH intermediate_results (name, debit, credit)
AS (
SELECT
Name
AS name,
(SELECT
SUM(CAST(Amount AS BIGINT))
FROM Items
WHERE RemittingMember = a.Number
and RecordId = 50)
AS debit,
(SELECT SUM(CAST(Std_Amount AS BIGINT))
FROM Items
WHERE RemittingMember = a.Number
AND RecordId = 10)
AS credit
FROM Member a
)
INSERT INTO #results
SELECT name, debit, credit, debit - credit, SIGN(debit - credit)
FROM intermediate_results
关于sql-server-2008 - 如何在同一查询中引用另一列中的聚合列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17570897/