Sql 根据表中已有的行插入临时表

Sql 根据表中已有的行插入临时表,sql,sql-server,performance,insert,Sql,Sql Server,Performance,Insert,我正在构建一个包含不同类别、项目和成本的临时表 例如: Category Item Cost -------- ---- ---- Office Desk 100.00 Office Chair 75.00 Office PC 800.00 Home Desk 0.00 在我收到临时表进行处理时,有包含类别、项目和成本的单独行,以及包含每个类别总和的汇总行,这些类别总和的总和不为零: Category

我正在构建一个包含不同类别、项目和成本的临时表

例如:

Category    Item    Cost
--------    ----    ----
Office      Desk    100.00
Office      Chair   75.00
Office      PC      800.00
Home        Desk    0.00
在我收到临时表进行处理时,有包含类别、项目和成本的单独行,以及包含每个类别总和的汇总行,这些类别总和的总和不为零:

Category    Item    Cost    Type
--------    ----    ----    -----
Office      Desk    100.00  Cost
Office      Chair   75.00   Cost
Office      PC      800.00  Cost
Office      null    975.00  Summary
Home        Desk    0.00    Cost
我现在也想为$0.00成本行添加摘要行,但我很难弄清楚如何这样做

INSERT INTO #Table
SELECT X.Category, null, 0.00, 'Summary'
FROM #Table X
...[Get Category data that does not have a Summary row]
我曾想过

WHERE NOT EXISTS ( SELECT * FROM #Table Y WHERE Y.Category = X.Category AND Type = 'Summary')
GROUP BY X.Category

但是我担心性能,因为这个表中可能有很多行。

您应该对性能进行基准测试,但我发现联接速度更快。此外,如果数据集非常大,则在将数据加载到临时表后添加索引可以显著加快后续表查询的速度

INSERT INTO #Table
   SELECT X.Category, null, 0.00, 'Summary'
   FROM #Table X
   LEFT JOIN #Table Y ON Y.Category = X.Category AND Y.Type = 'Summary'
   WHERE Y.Category IS NULL

分两步来做怎么样-

1-直接插入原始数据-无摘要信息
2-插入更多数据-按类别选择数据分组,对成本使用总和聚合,对类型字段的项目和摘要硬编码为空

如果您关心性能,请发布执行计划。需要多长时间?需要多低?请澄清。是否要将类别从表插入到其自身?