Skip to main content

Fact Tables Reference

Fact tables in the Digital.ai Agility Data Mart contain measurement data used in reports. This data can be analyzed or classified by information available in dimension tables.

Overview

In a star schema, fact tables contain the measurement data being used in reports. In the Digital.ai Agility Data Mart, all Fact tables are in a database namespace (schema) known as "Fact".

Fact Table Types

The Data Mart includes the following primary fact tables:

  • Fact.Workitem - Metrics for all workitems (primary and secondary)
  • Fact.PrimaryWorkitem - Metrics specific to Stories, Defects, and TestSets
  • Fact.Effort - Time tracking entries
  • Fact.Epic - Epic trend data over time
  • Fact.EpicDaysIn - Days an Epic spent in each status
  • Fact.EpicTest - Epic test information
  • Fact.Issue - Daily changes to Issues
  • Fact.PrimaryWorkitemDaysIn - Days a workitem spent in each status
  • Fact.ProjectSummary - Project summary trend data
  • Fact.Request - Daily changes to Requests
  • Fact.Test - Test execution details
  • Fact.TestRun - Test run records
  • Additional merged fact tables - Created during ETL and merged into Fact.Workitem
note

All numeric columns in fact tables are designed for aggregation. Check the semi-additive versus additive designation to understand how metrics accumulate over time.

Fact.Workitem

The Fact.Workitem table contains metrics available on any workitem, including both primary workitems (Stories, Defects, TestSets) and secondary workitems (Tasks, Tests).

Overview

  • Granularity: One row per workitem per day
  • Metrics Type: Semi-additive (cumulative only for a given day)
  • Use Case: Comprehensive workitem reporting across all types

Available Metrics

  • Estimate - The Estimate attribute on Primary Workitems
  • Detail Estimate - Detail Estimate on all workitems
  • ToDo - Remaining work on all workitems
  • Done - Effort recorded against workitems (not always historically accurate)
  • Custom Fields - Supported custom fields defined on workitems
note

The Done attribute represents the amount of Effort recorded against the workitem regardless of other attributes. The value is correct but not always historically accurate. For historically accurate effort data, see Fact.Effort.

Table Columns

Column NameDescriptionDatatypeForeign Key To
DateKeyDate of this measureintDim.Date
WorkitemKeyData Mart identifier for the PrimaryWorkitemKey or SecondaryWorkitemKeyint
AssetTypeKeyData Mart identifier for the type of workitemintDim.AssetType
PrimaryWorkitemKeyData Mart identifier for the Story or DefectintDim.PrimaryWorkitem
SplitFromKeyData Mart identifier for the Primary Workitem this was split fromintDim.PrimaryWorkitem
ProjectKeyData Mart identifier for the Project containing this workitemintDim.Project
IterationKeyData Mart identifier for the Iteration containing this workitemintDim.Iteration
ThemeKeyData Mart identifier for the Theme containing this workitemintDim.Theme
TeamKeyData Mart identifier for the Team assigned to this workitemintDim.Team
CustomerKeyData Mart identifier for the Member acting as Customer (Stories only)intDim.Member
EpicKeyData Mart identifier for the Epic (when workitem is part of an Epic)intDim.Epic
WorkitemSourceKeyData Mart identifier for Source of this workitemintDim.WorkitemSource
WorkitemPriorityKeyData Mart identifier for the Priority of this workitemintDim.WorkitemPriority
WorkitemStatusKeyData Mart identifier for the Status of this workitemintDim.WorkitemStatus
StoryRiskKeyData Mart identifier for Risk (Stories only)intDim.StoryRisk
StoryTypeKeyData Mart identifier for Type (Stories only)intDim.StoryType
DefectTypeKeyData Mart identifier for Type (Defects only)intDim.DefectType
DefectResolutionKeyData Mart identifier for the Defect ResolutionintDim.DefectResolution
VerifiedByKeyData Mart identifier for the Member that verified the DefectintDim.Member
RegressionSuiteKeyData Mart identifier for the Regression SuiteintDim.RegressionSuite
EnvironmentKeyData Mart identifier for the EnvironmentintDim.Environment
RegressionPlanKeyData Mart identifier for the Regression PlanintDim.RegressionPlan
PrimaryAssetStateKeyData Mart identifier for the asset state of the Story or DefectintDim.AssetState
ClassOfServiceData Mart identifier for the Class of ServiceintDim.ClassOfService
SecondaryWorkitemKeyData Mart identifier when the workitem is a Task or TestintDim.SecondaryWorkitem
TaskStatusKeyData Mart identifier for the Task StatusintDim.TaskStatus
TaskTypeKeyData Mart identifier for the Task TypeintDim.TaskType
TaskSourceKeyData Mart identifier for the Task SourceintDim.TaskSource
SecondaryAssetStateKeyData Mart identifier for the asset state of the Task or TestintDim.AssetState
TestTypeKeyData Mart identifier for the Test TypeintDim.TestType
TestStatusKeyData Mart identifier for the Test StatusintDim.TestStatus
RegressionTestKeyData Mart identifier for the Regression TestintDim.RegressionTest
EstimateEstimate measure (Stories and Defects only)real
DetailEstimateDetail Estimate measurereal
ToDoToDo measurereal
DoneEffort measurereal

Fact.PrimaryWorkitem

The Fact.PrimaryWorkitem table contains metrics available on Primary Workitems (Stories, Defects, and TestSets).

Overview

  • Granularity: One row per Primary Workitem per day
  • Metrics Type: Semi-additive (cumulative only for a given day)
  • Use Case: Reporting focused on Stories, Defects, and TestSets only

Available Metrics

  • Estimate - The Estimate attribute on Primary Workitems
  • Detail Estimate - Detail Estimate on all workitems
  • ToDo - Remaining work on workitems
  • Done - Effort recorded against the primary workitem (not always historically accurate)
  • Custom Fields - Supported custom fields defined on Primary and Secondary Workitems
tip

Use Fact.PrimaryWorkitem when your reports focus exclusively on Stories, Defects, and TestSets. Use Fact.Workitem when you need to include Tasks and Tests in the same report.

Table Columns

Column NameDescriptionDatatypeForeign Key To
DateKeyDate of this measureintDim.Date
WorkitemKeyThe PrimaryWorkitemKey for this measureint
AssetTypeKeyData Mart identifier for the type of workitemintDim.AssetType
PrimaryWorkitemKeyData Mart identifier for the Story or DefectintDim.PrimaryWorkitem
SplitFromKeyData Mart identifier for the Primary Workitem this was split fromintDim.PrimaryWorkitem
ProjectKeyData Mart identifier for the Project containing this workitemintDim.Project
IterationKeyIdentifier for the Theme containing this workitemintDim.Iteration
ThemeKeyData Mart identifier for the Iteration containing the workitemintDim.Theme
TeamKeyData Mart identifier for the Team assigned to this workitemintDim.Team
CustomerKeyData Mart identifier for the Member acting as Customer (Stories only)intDim.Member
EpicKeyData Mart identifier for the Epic (when Story is part of an Epic)intDim.Epic
WorkitemSourceKeyData Mart identifier for Source of this workitemintDim.WorkitemSource
WorkitemPriorityKeyData Mart identifier for the Priority of this workitemintDim.WorkitemPriority
WorkitemStatusKeyData Mart identifier for the Status of this workitemintDim.WorkitemStatus
StoryRiskKeyData Mart identifier for Risk (Stories only)intDim.StoryRisk
StoryTypeKeyData Mart identifier for Type (Stories only)intDim.StoryType
DefectTypeKeyData Mart identifier for Type (Defects only)intDim.DefectType
DefectResolutionKeyData Mart identifier for the Defect ResolutionintDim.DefectResolution
VerifiedByKeyData Mart identifier for the Member that verified the DefectintDim.Member
RegressionSuiteKeyData Mart identifier for the Regression SuiteintDim.RegressionSuite
EnvironmentKeyData Mart identifier for the EnvironmentintDim.Environment
RegressionPlanKeyData Mart identifier for the Regression PlanintDim.RegressionPlan
PrimaryAssetStateKeyData Mart identifier for the state this workitemintDim.AssetState
ClassOfServiceKeyData Mart identifier for the Class Of ServiceintDim.ClassOfService
EstimateEstimate measurereal
DetailEstimateDetail Estimate measure (Note 1)real
ToDoToDo measure (Note 1)real
DoneDone measure (Note 1)real
note

Note 1: These fields are populated based on the Tracking Level settings in your Digital.ai Agility instance.

Fact.Effort

Effort is a measure of the amount of time spent working on a feature or defect. In the core application, effort is accumulated in the Done field.

Overview

  • Granularity: One row per effort entry
  • Metrics Type: Additive (does not accumulate over time)
  • Use Case: Historically accurate time tracking reporting
  • Historical Accuracy: All attributes are correct at the time the Effort was recorded and do not change

Purpose

Each row in the Fact.Effort table represents a single Effort entry and is historically accurate. This means attributes are recorded at the time effort is logged and remain unchanged even if related items move or change.

Example: If effort is recorded against a Defect in Project X and that Defect moves to Project Y, the Effort record does not reflect the move.

tip

For Effort based on current attribute values, use the Done column in Fact.PrimaryWorkitem, Fact.Workitem, or specific workitem fact tables.

Table Columns

Column NameDescriptionDatatypeForeign Key To
EffortKeyDatamart unique identifier for this entryint
AuditIdentifier for this entryint
DateKeyDate this entry was reported as Foreign Key relationshipintDim.Date
DateDate this entry was reporteddatetime
MemberKeyMember reporting effortintDim.Member
WorkitemKeyIdentifies the Workitem where effort was reportedint
ProjectKeyIdentifies the Project where effort was reportedintDim.Project
IterationKeyIdentifies the Iteration where effort was reportedintDim.Iteration
TeamKeyIdentifies the Team reporting effortintDim.Team
PrimaryWorkitemKeyIdentifies the Primary Workitem associated with this entryintDim.PrimaryWorkitem
SecondaryWorkitemKeyIdentifies the Task or Test associated with this entryintDim.SecondaryWorkitem
ThemeKeyIdentifies the Theme associated with this entryintDim.Theme
EpicKeyIdentifies the Epic associated with this entry at the time effort was enteredintDim.Epic
EffortEffort valuedecimal(16,2)

Important Notes

  1. Historical Accuracy: Attributes are correct at the time Effort is recorded and do not change. If a workitem moves to a different project or iteration after effort is logged, the Effort record continues to reference the original project/iteration.

  2. Epic Association: Each Effort record is augmented with EpicKey by the ETL. Epic Key is the unique identifier for the Portfolio Item associated with the Story, Defect, or TestSet at the time the Effort was entered. If a Story moves from Epic A to Epic B, Fact.Effort will contain effort associated to both Epics.

  3. Same as Source: Fact.Effort contains the same information as the source table in Digital.ai Agility, with additional Epic association added during ETL.

Fact.Epic

Use Fact.Epic to create reports that trend Epic data over time or report on Epic attribute values for a given day.

Overview

  • Granularity: One row per Epic per day
  • Metrics Type: Semi-additive (cumulative only for a given day)
  • Use Case: Epic trending and historical analysis
note

To report on Epic attributes for a specific day, specify a Date filter that identifies the date of interest.

Table Columns

Key columns include:

  • DateKey, EpicKey, ProjectKey, ProgramKey
  • Epic status, priority, type dimensions
  • Custom fields configured for Epics
  • Estimate and effort metrics specific to Epics

For complete column details, query the Fact.Epic table schema in your Data Mart instance.

Fact.EpicDaysIn

The Fact.EpicDaysIn table contains information about how many days an Epic was in a given status value.

Overview

  • Granularity: One row per Epic per status value
  • Metrics Type: Count of days
  • Use Case: Cycle time analysis for Epics
  • DateKey: Always set to the maximum date value from Fact.Epic
caution

Oscillation between status values is not reflected in this table. Therefore, the DaysInStatus value may be greater than the value calculated by subtracting FirstDateInStatus from LastDateInStatus.

Table Columns

Column NameDescriptionDatatypeForeign Key To
DateKeyMaximum Date in Fact.EpicintDim.Date
EpicKeyData Mart identifier for the EpicintDim.Epic
EpicStatusKeyData Mart identifier for the Epic Status valueintDim.EpicStatus
DaysInStatusThe number of days this Epic has been in this status valueint
FirstDateInStatusThe first date this Epic was seen in this status valuedatetime
LastDateInStatusThe last date this Epic was seen in this status valuedatetime

Fact.EpicTest

The Fact.EpicTest table contains test information related to Epics.

Overview

  • Granularity: One row per Epic test per day
  • Metrics Type: Semi-additive
  • Use Case: Epic test tracking and quality metrics

For complete column details, query the Fact.EpicTest table schema in your Data Mart instance.

Fact.Issue

The Fact.Issue table captures information about daily changes to Issues.

Overview

  • Granularity: One row per Issue per day
  • Metrics Type: Semi-additive (cumulative only for a given day)
  • Use Case: Issue tracking and trend analysis
  • Custom Fields: Supported custom fields are available

Table Columns

Column NameDescriptionDatatypeForeign Key To
DateKeyDate of this measureintDim.Date
IssueKeyDatamart identifier for the IssueintDim.Issue
ProjectKeyDatamart identifier for the project containing this issueintDim.Project
TeamKeyDatamart identifier for the team assigned to this issueintDim.Team
OwnerKeyDatamart identifier for the member responsible for this issueintDim.Member
ResolutionKeyDatamart identifier for the issue resolutionintDim.IssueResolution
SourceKeyDatamart identifier for the source of this issueintDim.WorkitemSource
PriorityKeyDatamart identifier for the issue priorityintDim.IssuePriority
CategoryKeyDatamart identifier for the issue categoryintDim.IssueCategory
AssetStateKeyDatamart identifier for the asset state of this issueintDim.AssetState

Fact.PrimaryWorkitemDaysIn

The Fact.PrimaryWorkitemDaysIn table tracks the number of days a workitem (Story, Defect, TestSet) spent in a given status value.

Overview

  • Granularity: One row per Primary Workitem per status value
  • Metrics Type: Count of days
  • Use Case: Cycle time and lead time analysis for workitems
note

Similar to Fact.EpicDaysIn, oscillation between statuses is not reflected. The DaysInStatus value may exceed the calculated difference between FirstDateInStatus and LastDateInStatus.

Table Columns

Key columns include:

  • DateKey, PrimaryWorkitemKey, WorkitemStatusKey
  • DaysInStatus, FirstDateInStatus, LastDateInStatus
  • Project, Team, and other dimension keys

For complete column details, query the Fact.PrimaryWorkitemDaysIn table schema in your Data Mart instance.

Fact.ProjectSummary

Use Fact.ProjectSummary to create reports that trend Project Summary data over time.

Overview

  • Granularity: One row per Project per day
  • Metrics Type: Semi-additive (cumulative only for a given day)
  • Use Case: Project-level rollup metrics and trending

Table Columns

Key columns include:

  • DateKey, ProjectKey
  • Aggregate metrics (total estimate, total done, total to-do)
  • Team and iteration associations
  • Project status and health indicators

For complete column details, query the Fact.ProjectSummary table schema in your Data Mart instance.

Fact.Request

The Fact.Request table captures daily changes to Requests.

Overview

  • Granularity: One row per Request per day
  • Metrics Type: Semi-additive (cumulative only for a given day)
  • Use Case: Request tracking and trend analysis
  • Custom Fields: Supported custom fields are available

Table Columns

Key columns include:

  • DateKey, RequestKey
  • ProjectKey, TeamKey, OwnerKey
  • Request status, priority, category dimensions
  • Resolution tracking

For complete column details, query the Fact.Request table schema in your Data Mart instance.

Fact.Test

The Fact.Test table provides details about tests run in your environment.

Overview

  • Granularity: One row per Test per day
  • Metrics Type: Semi-additive
  • Use Case: Test execution tracking and quality metrics

Table Columns

Key columns include:

  • DateKey, TestKey
  • Test status, type dimensions
  • Associated workitem and regression test keys
  • Custom fields configured for Tests

For complete column details, query the Fact.Test table schema in your Data Mart instance.

Fact.TestRun

The Fact.TestRun table records test runs in your environment.

Overview

  • Granularity: One row per test run
  • Metrics Type: Additive
  • Use Case: Test execution history and quality trending

Table Columns

Key columns include:

  • TestRunKey, DateKey
  • Test and build associations
  • Status and result tracking
  • Elapsed time metrics

For complete column details, query the Fact.TestRun table schema in your Data Mart instance.

Using Fact Tables Effectively

Choosing the Right Fact Table

Use Fact.Workitem when:

  • You need comprehensive reporting across all workitem types
  • Reports include both primary workitems (Stories/Defects) and secondary workitems (Tasks/Tests)
  • You want a single unified view of work

Use Fact.PrimaryWorkitem when:

  • Reports focus exclusively on Stories, Defects, and TestSets
  • You don't need Task or Test data
  • You want simpler joins with fewer columns

Use Fact.Effort when:

  • You need historically accurate time tracking
  • Analysis requires knowing the context when effort was logged
  • Reports track effort by the original project/iteration/Epic association

Use Fact.Epic when:

  • Reporting on Epic-level metrics and trends
  • Tracking Epic progress over time
  • Portfolio-level analysis

Use DaysIn fact tables when:

  • Calculating cycle time or lead time metrics
  • Analyzing time spent in specific statuses
  • Understanding workflow bottlenecks

Semi-Additive vs. Additive Metrics

Semi-Additive Metrics (Fact.Workitem, Fact.PrimaryWorkitem, Fact.Epic, Fact.Issue, Fact.Request):

  • Metrics are cumulative only for a given day
  • To report on a specific date, filter by that DateKey
  • Aggregating across dates without proper filtering gives incorrect results
  • Example: Summing Estimate across multiple days would count the same workitem multiple times

Additive Metrics (Fact.Effort, Fact.TestRun):

  • Metrics can be summed across all dimensions including time
  • Each row represents a distinct event
  • Example: Summing Effort values across dates gives total effort for the period

Performance Optimization

Index Usage:

  • All DateKey columns are indexed for efficient date filtering
  • Dimension foreign keys are indexed for join performance
  • Always include DateKey in your WHERE clause when querying semi-additive facts

Best Practices:

  • Filter by DateKey early in queries to reduce result set size
  • Use appropriate fact table granularity (don't use Fact.Workitem if Fact.PrimaryWorkitem suffices)
  • Join to dimension tables only when you need their attributes
  • Consider using views for complex frequently-used join patterns