更新表以按分组列显示总计 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】:

不断更新数据是没有意义的。这将是大量的处理,然后你会失去数据的完整性。相反,我会用这种类型的结果集创建一个PROCEDUREVIEW。然后,当您想要返回它时,您可以查询它并且永远不会丢失您以后可能需要的规范化数据。话虽如此,这是执行此操作的代码(除非您不会使用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的主要内容,如果未能解决你的问题,请参考以下文章

更新 SQL Server 表以通过存储过程执行此操作

SQL Server Reporting Services 在聚合数据上运行总计

两个查询:按列分组、减去相似列、显示总计

SQL Server:减去相邻列分组

在 SQL Server 中的计算列上运行总计

在 SQL Server 2005+ 中获取列总计的最优化方法