更新表以按分组列显示总计 SQL Server 2008 R2
Posted
技术标签:
【中文标题】更新表以按分组列显示总计 SQL Server 2008 R2【英文标题】:Update table to display total by grouped columns SQL Server 2008 R2 【发布时间】:2018-11-23 15:22:05 【问题描述】:我正在使用一个按月存储金额的表格。该表被许多存储过程插入/更新。
我想要完成的工作:我想更新表格,使其具有基于以下列组合的唯一行:
Property_ID, Accound, AccountDescription, jobcd, costcd, asofdate
此外,更新将 SUM 以上组合的金额。但是,Update_ID
列也会更新并合并step_id
。
总之,我想要一行按上面列出的列显示总金额。它将删除用于创建此总额的行。但是,它会保留step_Id
信息并将其添加到Update_ID
列中。
有没有办法在不涉及许多步骤的情况下做到这一点?这是一张没有索引的大表。
declare @temp as table
(
ID int,
step_ID varchar(120),
Update_ID varchar(1000),
Property_ID int,
Account int,
AccountDescription varchar(120),
jobcd varchar(20),
costcd varchar(20),
asofdate date,
amount money
)
INSERT INTO @temp (ID, step_ID, Update_ID, Property_ID, Account, AccountDescription, jobcd, costcd, asofdate, amount)
VALUES (1, 'Step 1.1', NULL, 50950, 41510, 'CAM&taxes billed', 'TMORFRA01' , 'LMORFRA01', '2019-09-01', '20.00'),
(2, 'Step 1.2', 'Step 1.0', 50950, 41510, 'CAM&taxes billed', 'TMORFRA01' , 'LMORFRA01', '2019-09-01', '180.00'),
(3, 'Step 1.1', NULL, 50950, 40110, 'Base rent billed', 'TMORFRA01' , 'LMORFRA01', '2019-09-01', '80.00'),
(4, 'Step 1.2', NULL, 50950, 40110, 'Base rent billed', 'TMORFRA01' , 'LMORFRA01', '2019-09-01', '100.00'),
(5, 'Step 1.3', NULL, 50950, 40110, 'Base rent billed', 'TMORFRA01' , 'LMORFRA01', '2019-09-01', '200.00')
SELECT * FROM @temp
预期结果:
declare @ExpectedResult as table
(
ID int ,
step_ID varchar(120),
Update_ID varchar(1000),
Property_ID int,
Account int,
AccountDescription varchar(120),
jobcd varchar(20),
costcd varchar(20),
asofdate date,
amount money
)
INSERT INTO @ExpectedResult (ID, step_ID, Update_ID, Property_ID, Account, AccountDescription, jobcd, costcd, asofdate, amount)
VALUES (1, 'Step 1.1', 'Step 1.0; Step 1.1 + Step 1.2: Sum Amounts;', 50950, 41510, 'CAM&taxes billed', 'TMORFRA01' , 'LMORFRA01', '2019-09-01', '200.00'),
(3, 'Step 1.1', 'Step 1.1 + Step 1.2 + Step 1.3: Sum Amounts', 50950, 40110, 'Base rent billed', 'TMORFRA01' , 'LMORFRA01', '2019-09-01', '380.00')
SELECT * FROM @ExpectedResult
【问题讨论】:
【参考方案1】:不断更新数据是没有意义的。这将是大量的处理,然后你会失去数据的完整性。相反,我会用这种类型的结果集创建一个PROCEDURE
或VIEW
。然后,当您想要返回它时,您可以查询它并且永远不会丢失您以后可能需要的规范化数据。话虽如此,这是执行此操作的代码(除非您不会使用order by
):
--create view... or create proc which ever...
select
ID = min(ID)
,step_id = min(step_id)
,Updated_ID = STUFF(
STUFF((
SELECT ' + ' + t2.step_id
FROM @temp t2
WHERE
t2.Property_ID = t.Property_ID
and t2.Account = t.Account
and t2.jobcd = t.jobcd
and t2.costcd = t.costcd
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + ': Sum Amounts', 1, 1, '')
,Property_ID
,Account
,AccountDescription
,jobcd
,costcd
,asofdate
,amount = sum(amount)
from @temp t
group by
Property_ID
,Account
,AccountDescription
,jobcd
,costcd
,asofdate
order by
ID
【讨论】:
以上是关于更新表以按分组列显示总计 SQL Server 2008 R2的主要内容,如果未能解决你的问题,请参考以下文章