我们的数据库中有 12 种类型的费用,其中一些有相当不同的数据减去金额字段。我们在应用程序和报告中有多个地方需要单个和多个费用总计以及每个费用类型和总计的计数。最后,我们希望所有这些调用都有一个视图,但可以使用存储过程。
我们为此查看了多种替代方案,发现 CTE 允许我们在不使用临时表的情况下获取所需的所有数据。使用连接不起作用,因为无论我们尝试什么,我们都看到记录被复制或删除。
我附上了费用表的一个子集和包含 CTE 的查询。有没有人有比这更好的选择?更快的东西?我们是否适当地接近这种“扁平化”?
请注意,无论是 View 还是 Proc,此查询的执行计划都是相同的,并且 Proc 的运行时间似乎是原来的两倍。
下面是代码
WITH pe AS
(
SELECT
EventRegistrationId
,sum(AmountPaid) as AmountPaidTotal
,sum(CommercialValueAmount) as CommercialValueAmountTotal
,count(1) as ExpenseCount
FROM PettyExpenses
WHERE IsDisputed = 0 AND IsUndisputed = 0
group by EventRegistrationId
),hpe AS
(
SELECT
EventRegistrationId
,sum(AmountPaid) as AmountPaidTotal
,sum(CommercialValueAmount) as CommercialValueAmountTotal
,count(1) as ExpenseCount
FROM HirePremisesExpenses
WHERE IsDisputed = 0 AND IsUndisputed = 0
group by EventRegistrationId
), ae AS
(
SELECT
EventRegistrationId
,sum(AmountPaid) as AmountPaidTotal …
Run Code Online (Sandbox Code Playgroud) 我收到了很多错误DBCC CHECKDB
,包括:
消息 8939,级别 16,状态 98,第 1 行
表错误:对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 3667181342891245568(未知类型),页面(7791:-1694668604)。测试 (IS_OFF (BUF_IOERR, pBUF->bstat)) 失败。值为 133129 和 -12。
消息 8928,级别 16,状态 1,第 1 行
对象 ID 405576483,索引 ID 73,分区 ID 72057594049200128,分配单元 ID 72057594054246400(类型行内数据):处理页 (1:194) 有关详细信息,请参阅其他错误。
消息 8976,级别 16,状态 1,第 1 行
表错误:对象 ID 405576483,索引 ID 73,分区 ID 72057594049200128,分配单元 ID 72057594054246400(类型行内数据)。页面 (1:194923) 未在扫描中看到,尽管其父页面 (1:186194) 和上一个页面 (1:194922) 引用了它。检查以前的任何错误。
消息 8980,级别 16,状态 1,第 1 行
表错误:对象 ID 405576483,索引 ID 73,分区 ID 72057594049200128,分配单元 ID 72057594054246400(类型行内数据)。索引节点页 (1:186194),槽 …
我不是 dba,但我正在尝试为视图创建一个有效的查询,该查询将在表上返回一些总计
select
(select count(1) from alerts) as Total,
(select count(1) from alerts where iscomplete is null or iscomplete = 0) as Active,
(select count(1) from alerts where iscomplete = 1) as Complete
Run Code Online (Sandbox Code Playgroud)